gcc - 为什么 GCC 在 64 位上会丢弃帧指针?

标签 gcc assembly x86 64-bit stack-frame

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

编辑:

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

Starting with GCC version 4.6, the default setting (when not optimizing for size) for 32-bit Linux x86 and 32-bit Darwin x86 targets has been changed to -fomit-frame-pointer. The default can be reverted to -fno-omit-frame-pointer by configuring GCC with the --enable-frame-pointer configure option.

但是为什么呢?

最佳答案

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

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

关于gcc - 为什么 GCC 在 64 位上会丢弃帧指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6099919/

相关文章:

c++ - 在 x86 程序集中更改数组的值(嵌入在 C++ 中)

c - 为什么数组的最大大小是 "too large"?

c++ - GCC对纯函数的优化

c - 没有成员编译错误

node.js - 如何设置将运行可执行文件的默认应用程序

assembly - RISC-V 汇编语法中的混合目标/源操作数顺序

assembly - 向 -Inf : how does it work? 舍入的快速浮点到整数公式

c - x86-64 汇编到 C

linux - 为什么静态链接的可执行文件中会有全局偏移表和过程链接表?

gcc - clang 汇编程序的奇怪行为