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

问题描述 投票:14回答:1

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

编辑:

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

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

但为什么?

gcc assembly x86 64bit stackframe
1个回答
10
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.