gpt4 book ai didi

assembly - 有什么方法可以判断变量是否被优化了?

转载 作者:行者123 更新时间:2023-12-02 03:18:48 26 4
gpt4 key购买 nike

我有一些看起来像这样的 Fortran 代码:

 subroutine foo(mx,my,mz)
real pts(3,mx,my,mz)
end

数组 pts 从未在子例程中实际使用过——我只是在重构代码时忘记删除它。现在,由于fortran没有堆栈与堆的概念,因此由编译器在哪里分配pts——这是gfortran中数组大小的函数,但我无法弄清楚portland group编译器如何处理这个。

是否可以判断 pts 是否分配在堆栈、堆上,或者是否已完全优化(可能应该如此)?是否有可能出现 stackoverflow 而自己却不知道(即没有运行时错误)?我的直觉是,应该可以通过查看编译器生成的程序集来判断,但我不知道我会在那里看到什么。

最佳答案

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

  • gfortran 插入对 malloc 的调用
  • ifort 默认情况下分配堆栈上的所有数组。如果通过 -heap-arrays <size> 启用自动堆数组它将生成对 for_alloc 的调用用于堆分配
  • PGI 编译器生成对 pgf90_auto_alloc 的调用但我对这个编译器及其分配数组的方式没有经验

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

关于assembly - 有什么方法可以判断变量是否被优化了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10725781/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com