mgi*_*son 2 memory heap assembly stack fortran
我有一些看起来像这样的fortran代码:
subroutine foo(mx,my,mz)
real pts(3,mx,my,mz)
end
Run Code Online (Sandbox Code Playgroud)
数组pts从未在子例程中实际使用过 - 我只是在重构代码时忘记删除它.现在,因为fortran没有堆栈与堆的概念,所以由编译器来分配pts - 这是gfortran中数组大小的函数,但我无法弄清楚portland组编译器的方式处理这个.
是否有可能判断是否在堆栈,堆上分配了pts,或者它是否完全被完全优化(可能应该如此)?是否有可能有一个stackoverflow而不知道它(即没有运行时错误)?我的直觉是,应该可以通过查看编译器生成的程序集来判断,但我不知道我在那里看到的是什么.
最简单的方法是查看编译器在编译时提供的汇编代码-S或使用调试器查找符号.如果在堆上分配数组,则很可能会调用分配函数:
malloc-heap-arrays <size>它将生成for_alloc对堆分配的调用pgf90_auto_alloc但我没有使用此编译器及其分配数组的方式顺便说一下,即使使用默认优化级别,gfortran也会在未引用数组时删除该数组.我猜其他编译器会做同样的事情,但我不会赌它.