Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory 有没有办法判断一个变量是否被优化了?_Memory_Assembly_Stack_Heap_Fortran - Fatal编程技术网

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

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是在堆栈、堆上分配的,还是完全优化了(可能应该是这样的)?是否可能存在堆栈溢

我有一些fortran代码,看起来像:

 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
    的调用,但我对该编译器及其分配数组的方式没有经验
顺便说一下,gfortran即使在默认优化级别下也不会引用该数组。我想其他的编译器也会这么做,但我不会打赌