【问题标题】:Aliasing in Fortran functionFortran 函数中的别名
【发布时间】:2011-12-08 21:56:43
【问题描述】:

出于优化原因,Fortran 强制子例程或函数的虚拟参数不是别名,即它们不指向同一个内存位置。

我想知道相同的约束是否适用于函数的返回值。 换句话说,对于给定的 myfunc 函数:

function myfunc(a)
    real, intent(in) :: a(:)
    real             :: myfunc(size(a))
    myfunc = a * 2
end function myfunc

这样写是否符合标准: a = myfunc(a) 和 b = myfunc(a) ?

【问题讨论】:

    标签: fortran standards-compliance


    【解决方案1】:

    函数的参数和函数的返回值是不同的东西。与前面的答案相反,功能参数是通过引用传递的,或者通过复制输入复制输出,除非它们被声明为具有 VALUE 属性的虚拟参数。这是 Fortran 与 C 的主要区别。

    但是,如果函数值是通过普通赋值 (=) 而不是通过指针赋值 (=>) 构造的,则它们是单独的实体。在您的代码中,myfunc 的值是通过复制 a 的值获得的。因此a = myfunc(a)b = myfunc(a) 没有违反任何标准规则。

    【讨论】:

      【解决方案2】:

      由于 myfunc 中的变量 a 是独立于作为父例程的虚拟参数传递的 a 的实体,因此这样做非常好:

      a = myfunc(a)
      

      a = SQRT(a)
      

      这里没有冲突,因为 a 的值被复制到函数内部的虚拟参数,正在评估函数,最后函数的值被复制到 a。

      来自 Fortran 2008 标准草案:

      12.5.3 函数参考

      1 在表达式求值期间通过函数引用或定义的操作(7.1.6)调用函数。 当它被调用时,所有实际的参数表达式都会被计算, 然后关联参数,然后执行函数。 当函数执行完成时,函数的值 结果可用于导致函数的表达式 被调用。函数结果(12.3.3)的特征是 由函数的接口决定。如果引用一个 元素函数(12.8)是元素引用,所有数组 参数应具有相同的形状。

      一般来说,强制函数没有副作用是一种很好的做法,例如使用PURE 属性并为所有虚拟参数声明INTENT

      【讨论】:

      • 你回答的第一句话肯定不是真的。
      • 请随时在适当的地方编辑答案,或添加其他答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多