Memory 有没有办法判断一个变量是否被优化了?
我有一些fortran代码,看起来像:Memory 有没有办法判断一个变量是否被优化了?,memory,assembly,stack,heap,fortran,Memory,Assembly,Stack,Heap,Fortran,我有一些fortran代码,看起来像: subroutine foo(mx,my,mz) real pts(3,mx,my,mz) end 数组pts从未在子例程中实际使用过——我只是在重构代码时忘了删除它。现在,因为fortran没有堆栈与堆的概念,所以在哪里分配pts取决于编译器——这是gfortran中数组大小的函数,但我还没有弄清楚portland group编译器是如何处理的 有没有可能判断pts是在堆栈、堆上分配的,还是完全优化了(可能应该是这样的)?是否可能存在堆栈溢
subroutine foo(mx,my,mz)
real pts(3,mx,my,mz)
end
数组pts从未在子例程中实际使用过——我只是在重构代码时忘了删除它。现在,因为fortran没有堆栈与堆的概念,所以在哪里分配pts取决于编译器——这是gfortran中数组大小的函数,但我还没有弄清楚portland group编译器是如何处理的
有没有可能判断pts是在堆栈、堆上分配的,还是完全优化了(可能应该是这样的)?是否可能存在堆栈溢出而不知道它(即没有运行时错误)?我的直觉是,应该可以通过查看编译器生成的程序集来判断,但我不知道我将在那里查看什么。我认为这是一个高度特定于编译器的问题,从某种意义上说,与死代码消除相关的行为不是通用的,不仅是编译器特定的,而且是特定于大小写的。启用优化的现代编译器肯定会消除所有无法访问的代码,或者在程序状态方面一无所获的代码。未使用的变量和数组根本不会在最终的可执行文件中结束
正如您所提到的,最好的办法是查看已编译二进制文件的汇编代码并查看它的功能。最简单的方法是查看编译器在使用
-S
编译时提供的汇编代码,或者使用调试器查找符号。如果在堆上分配数组,则很可能会调用分配函数:
- gfortran将调用插入到
malloc
- ifort默认情况下分配堆栈上的所有数组。如果通过
启用自动堆数组,它将为堆分配生成对-heap arrays
的调用
- PGI编译器生成对
的调用,但我对该编译器及其分配数组的方式没有经验pgf90_auto_alloc