use*_*035 7

我发现了这个:

-fmax-stack-var-size = n此选项指定将放在堆栈中的最大数组的大小(以字节为单位); 如果超出大小,则使用静态内存(标记为RECURSIVE的过程除外).使用选项-frecursive允许没有RECURSIVE属性的递归过程或并行程序.使用-fno-automatic永远不会使用堆栈.此选项当前仅影响使用常量边界声明的本地数组,并且可能不适用于所有字符变量.GNU Fortran的未来版本可能会改善这种行为.

n的默认值是32768.

来自gfortran的网站.我认为它会做到这一点.


mid*_*een 7

这是一个老问题,但接受的答案并不完全正确,我想为像我这样遇到帖子寻找答案的未来用户添加上下文。

我相信 intelifort和 gccgfortran都有一些字节限制,其中超出所述限制的数组不在堆栈上分配,而是在静态内存中。

英特尔的: -heap-arrays [size], 将根据大小将任何大于[size]千字节的数组放在堆上,而不是放在静态内存或堆栈上。

Gcc 没有这个选项,而只有-fmax-stack-var-size=n,其中n字节以上的任何变量都不会放在堆栈中。文档(https://gcc.gnu.org/onlinedocs/gfortran/Code-Gen-Options.html)说:

if the size is exceeded static memory is used (except in procedures marked as RECURSIVE).
Run Code Online (Sandbox Code Playgroud)

这里的主要区别是这些大变量不能保证放在堆上。

因此 intel 和 gcc 的两个选项并不相同,需要更加小心以确保gfortran在静态内存中不共享大数组。