1

假设我有一个非常大的数组verybigvariable

我已经定义了一个函数来执行一些这样的操作

function myfunc(var) result(res)
real:: var(:,:,:),res

...
...
...

end function myfunc

我的问题是当我这样调用这个函数时

myvar=myfunc(verybigvariable)

怎么了?它是否复制了我的变量,以便在函数执行期间在 ram 中保留 2X 空间?如果是这样,我该如何防止这种情况?(在一个简单的程序中,我知道,我可以在没有任何参数的情况下定义函数并使其使用现有变量,但如果我正在编写模块,似乎我必须在定义中包含参数)

4

2 回答 2

7

Fortran 语言标准没有指定参数的传递方式。通常,为了提高效率,编译器不会复制,而是传递参数的地址。在某些情况下,Fortran 编译器必须进行复制。例如,实际参数是一个不连续的数组,但过程需要一个连续的参数。编译器必须通过制作一个连续的副本传递给过程来修复不匹配。如果过程修改了该参数,则必须将值复制回原始参数。

于 2013-03-24T15:01:05.287 回答
0

在 fortran中,参数似乎是通过引用传递的。这意味着只传递变量的地址,然后函数可以通过该地址访问变量。

所以不,数组没有被复制,只传递了数组的地址。对于 32 位系统,开销为 32 位,对于 64 位系统,开销为 64 位。

我没有使用fortran的经验,这只是我通过谷歌搜索可以弄清楚的,所以如果任何Fortran程序员有任何意见,请随时编辑/评论。

于 2013-03-24T14:59:01.497 回答