有没有办法判断一个变量是否被优化了?

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而不知道它(即没有运行时错误)?我的直觉是,应该可以通过查看编译器生成的程序集来判断,但我不知道我在那里看到的是什么.

Hri*_*iev 5

最简单的方法是查看编译器在编译时提供的汇编代码-S或使用调试器查找符号.如果在堆上分配数组,则很可能会调用分配函数:

  • gfortran插入呼叫malloc
  • ifort默认分配堆栈上的所有数组.如果启用自动堆数组,-heap-arrays <size>它将生成for_alloc对堆分配的调用
  • PGI编译器生成调用pgf90_auto_alloc但我没有使用此编译器及其分配数组的方式

顺便说一下,即使使用默认优化级别,gfortran也会在未引用数组时删除该数组.我猜其他编译器会做同样的事情,但我不会赌它.