Arrays 将数组传递给函数/子例程时会发生什么?

Arrays 将数组传递给函数/子例程时会发生什么?,arrays,fortran90,Arrays,Fortran90,我以前从未想过这一点,但最近我一直在担心一些事情。在Fortran90(95)中,假设我创建了一个非常大的数组 Integer :: X(1000000) 然后我写了一个函数,把这个数组作为参数。当我将数组传递给函数时(如myfunc(X)),在运行时会发生什么 整个数组是否按值传递,并在函数内部构造一个新副本?(代价高昂) 或者编译器只是向数组传递某种引用或指针?(便宜) 数组的维数或函数的声明是否有区别?在Fortran 90中,与大多数其他编程语言一样,数组是通过引用传递的(从技术上讲,

我以前从未想过这一点,但最近我一直在担心一些事情。在Fortran90(95)中,假设我创建了一个非常大的数组

Integer :: X(1000000)
然后我写了一个函数,把这个数组作为参数。当我将数组传递给函数时(如
myfunc(X)
),在运行时会发生什么

整个数组是否按值传递,并在函数内部构造一个新副本?(代价高昂)
或者编译器只是向数组传递某种引用或指针?(便宜)


数组的维数或函数的声明是否有区别?

在Fortran 90中,与大多数其他编程语言一样,数组是通过引用传递的(从技术上讲,这通常是对数组第一项的引用)。在Fortran 90中,非数组值通常也通过引用传递。因此,您不必担心传递的参数的大小,因为它们不会被复制,而是通过引用传递。

您不想做的一件事是:

INTEGER :: X(1:1000,1:1000,1:1000)
CALL myRoutine(X(2:999,2:999,2:999))
其中myRoutine由于某种原因无法在数组的边界上操作。它无法传递对数组切片的引用,因为它在内存中不连续。因此,它创建一个临时数组并从X复制值。不用说,这是非常慢的。但1D数组不应该有这个问题,即使在指定片时也是如此,因为它们在内存中仍然是连续的