默认情况下,将帧指针放在64位架构上的理由是什么?我很清楚它可以启用但是为什么GCC在启用32位时首先禁用它?毕竟,64位的寄存器多于32位CPU。
在使用更新的GCC版本时,看起来也会为x86删除帧指针。从手册:
从GCC 4.6版开始,32位Linux x86和32位Darwin x86目标的默认设置(未针对大小进行优化时)已更改为-fomit-frame-pointer。通过使用
-fno-omit-frame-pointer
配置选项配置GCC,可以将默认值恢复为--enable-frame-pointer
。
但为什么?
答案 0 :(得分:10)
对于x86-64,ABI(PDF)鼓励缺少帧指针。基本原理或多或少“我们现在有DWARF,因此没有必要进行调试或异常展开;如果我们从第一天开始就选择它,那么任何软件都不会依赖于它的存在。”
x86-64确实有比x86-32更多的寄存器,但它仍然没有足够的。从编译器的角度来看,释放更多通用寄存器始终是一件好事。需要堆栈爬行的操作较慢,是的,但它们是罕见的事件,因此,在每个子程序调用以及更少的堆栈溢出时削减几个周期是一个很好的权衡。