我有一些Fortran代码调用RESHAPE
来重新排序矩阵,以便我现在要循环的维度成为第一个变化的维度(Fortran中的列主要顺序)。
这与C / Fortran互操作性无关。
现在矩阵相当大,当我调用RESHAPE
函数时,我得到一个seg错误,我非常有信心是堆栈溢出。我知道这是因为我可以使用-heap-arrays
在ifort中编译我的代码,问题就会消失。
我不想修改堆栈大小。这个代码需要可以在任何计算机上移植,而用户不必担心堆栈大小。
是否有某种程度上我可以调用RESHAPE
函数来使用堆而不是堆栈用于内部内存使用。
最糟糕的情况是我必须自己推出自己的' RESHAPE
函数用于此实例,但我希望有更好的方法。
答案 0 :(得分:4)
Fortran标准根本没有谈论堆栈和堆,这是一个实现细节。记忆中放置了哪些内容,是否有任何限制是实现定义的。
因此,无法从Fortran代码本身控制堆栈或堆行为。如果要指定编译器,则必须通过其他方式指示编译器,并使用编译器选项。默认情况下,英特尔Fortran使用堆栈并具有-heap-arrays n
选项(n是以kB为单位的限制),gfortran稍有不同,并且具有相反的-fstack-arrays
选项(包含在-Ofast
中,但可以是禁用)。
这适用于各种临时和自动阵列。