在 Fortran 中从数组复制到另一个数组时出现堆栈问题?

Stack problems when copying from array to another in Fortran?

如果我在 Fortran 中进行以下复制

 arr(i1:i2) = u(1:n) 

其中 SIZE(arr(i1:i2)) == SIZE(u(1:n)) 并且大小相对较大,例如 2M 双精度元素。

如果变量 arr 是另一个可分配数组的指针别名。 Fortran 会使用堆栈或堆内存来处理复制分配吗?

如果它正在使用堆栈,是否有任何特定的选择原因?

如何避免编译器使用堆栈来避免 Whosebug,而不必在 Linux 终端上 运行 ulimit -s unlimited。?

如果变量是指针,那么编译器几乎肯定会使用堆栈为副本创建临时文件,因为它必须假设可能存在重叠。它可能也不是简单的重叠,具有不连续的段,因此以不同的顺序进行复制并不总是有效。

Fortran 的语义是赋值的右侧在左侧被改变之前被完全求值。除非编译器可以证明没有重叠(使用 ALLOCATABLE 就足够了),否则它通常会使用堆栈临时文件进行复制。 Intel Fortran 有一个选项 -heap-arrays 告诉它在堆上分配这些临时变量,避免堆栈溢出。