Fortran函数中的别名

时间:2011-12-08 21:56:44

标签: fortran standards-compliance aliasing

出于优化原因,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)?

2 个答案:

答案 0 :(得分:3)

函数和函数返回值的参数是不同的东西。与前面的答案相反,函数参数ARE通过引用传递,或者通过copy-in copy-out传递,除非它们被声明为具有VALUE属性的伪参数。这是Fortran与C的主要区别。

但是,如果函数值是通过正常赋值(=)而不是通过指针赋值(=>)构造的,则它们是单独的实体。在您的代码中,通过复制a的值来获取myfunc的值。因此,a = myfunc(a)b = myfunc(a)不会破坏任何标准规则。

答案 1 :(得分:0)

由于myfunc中的变量a是与父例程中作为伪参数传递的单独实体,因此完全可以这样做:

a = myfunc(a)

a = SQRT(a)

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

来自Fortran 2008标准草案:

  

12.5.3功能参考

     

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

通常,强制功能不具有副作用是良好的做法,例如,使用PURE属性并为所有伪参数声明INTENT