我之前从未想过这件事,但最近我一直在担心。在Fortran90(95)中,假设我创建了一个非常大的数组
Integer :: X(1000000)
然后我编写了一个将此数组作为参数的函数。当我将数组传递给函数时(如在myfunc(X)
中),在运行时到底发生了什么?
整个数组是否按值传递并在函数内部构造新副本?(代价高昂)
或者编译器是否只是将某种引用或指针传递给数组?(便宜)
数组的维度或函数的声明是否有所不同?
答案 0 :(得分:2)
在Fortran 90中,与大多数其他编程语言一样,数组通过引用传递(从技术上讲,这通常是对数组第一项的引用)。在Fortran 90中,非数组值通常也通过引用传递。因此,您不必担心传递的参数的大小,因为它们不会被复制,而是仅通过引用传递。
答案 1 :(得分:1)
你不想做的一件事就是:
INTEGER :: X(1:1000,1:1000,1:1000)
CALL myRoutine(X(2:999,2:999,2:999))
由于某种原因,myRoutine无法对数组的边界进行操作。它不能将引用传递给数组的片,因为它在内存中不连续。因此它创建了一个临时数组并从X复制值。不用说这很慢。但是你不应该对1D数组有这个问题,即使在指定切片时也是如此,因为它们在内存中仍然是连续的。