16

默认情况下在 64 位架构上丢弃帧指针的基本原理是什么?我很清楚它可以启用,但为什么 GCC 在启用 32 位时首先禁用它?毕竟,64 位的寄存器比 32 位 CPU 多。

编辑:

看起来当使用更新的 GCC 版本时,x86 的帧指针也会被丢弃。从手册:

从 GCC 版本 4.6 开始,32 位 Linux x86 和 32 位 Darwin x86 目标的默认设置(未优化大小时)已更改为 -fomit-frame-pointer。可以通过使用configure 选项-fno-omit-frame-pointer配置 GCC来恢复默认值。--enable-frame-pointer

但为什么?

4

1 回答 1

12

对于 x86-64,ABI (PDF) 鼓励不使用帧指针。基本原理或多或少是“我们现在有 DWARF,因此不需要调试或异常展开;如果我们从一开始就将其设为可选,那么任何软件都不会依赖它的存在。”

x86-64 确实比 x86-32 有更多的寄存器,但它仍然没有足够的. 从编译器的角度来看,释放更多通用寄存器总是一件好事。需要堆栈爬取的操作较慢,是的,但它们是罕见的事件,因此这是一个很好的权衡,可以在每个子例程调用中减少几个周期并减少堆栈溢出。

于 2011-05-23T16:29:49.560 回答