为什么GCC将帧指针丢弃在64位上?

asd*_*sdf 14 64-bit x86 assembly gcc stack-frame

默认情况下,将帧指针放在64位体系结构上的理由是什么?我很清楚它可以启用但是为什么GCC在启用32位时首先禁用它?毕竟,64位的寄存器多于32位CPU.

编辑: 当使用更新的GCC版本时,看起来也会为x86删除帧指针.从手册:

"从GCC版本4.6开始,32位Linux x86和32位Darwin x86目标的默认设置(不优化大小时)已更改为-fomit-frame-pointer.默认设置可以恢复为-fno-通过使用--enable-frame-pointer配置选项配置GCC来省略帧指针."

但为什么?

zwo*_*wol 10

对于x86-64,ABI(PDF)鼓励缺少帧指针.基本原理或多或少是"我们现在有DWARF,因此没有必要进行调试或异常展开;如果我们从第一天开始就选择它,那么任何软件都不会依赖于它的存在."

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

  • 使用`.eh_frame`中的信息进行展开,**被映射到进程中(它是`.debug_frame`的子集).是的,它仍然比追逐帧指针慢,但正如我所说,假设这是一个罕见的事件. (3认同)
  • 通过 CFI 使用 DWARF 展开与遍历帧相比,性能如何?我想它会增加很多开销,因为 .debug_frame 部分没有映射到进程中,即需要一些系统调用来打开 ELF 二进制文件,然后解析文件以找到该部分,最后我们可以解析 CFI。这听起来都很慢。 (2认同)
  • [ABI](http://www.x86-64.org/documentation/abi.pdf)允许避免使用%rbp(请参阅第3.2.2节脚注7),但不是必须的。 *没有帧指针(在图3.3的堆栈帧布局中显示了`%rbp`的使用,在图3.4中被描述为“可选使用的帧指针”)。 (2认同)