编程参考 - omit-frame-pointer编译选项

# gcc  -fomit-frame-pointer -o main main.c

大多数较小的函数不需要帧指针,而较大的函数可能需要。

这实际上取决于编译器如何跟踪堆栈的使用情况,以及堆栈上的位置(局部变量、传递给当前函数的参数,以及为即将被调用的函数准备的参数)。我认为要确定哪些函数需要或不需要帧指针并不容易(从技术上讲,没有哪个函数必须有帧指针--更多的情况是 “如果编译器认为有必要使用帧指针来降低其他代码的复杂性”)。

我不认为你应该把 “试图让函数不需要框架指针 ”作为编码策略的一部分--就像我说的,简单的函数不需要框架指针,所以使用-fomit-frame-pointer,你就能为寄存器分配器多获得一个可用寄存器,并在函数的进入/退出时节省 1-3 条指令。如果你的函数需要框架指针,那是因为编译器认为这比不使用框架指针更好。我们的目标不是让函数不使用帧指针,而是让代码既能正确运行又能快速运行。

需要注意的是,“不使用帧指针 ”应该会带来更好的性能,但这并不是什么能带来巨大改进的灵丹妙药,尤其是在 x86-64 上,因为它一开始就已经有 16 个寄存器了。在 32 位 x86 上,由于只有 8 个寄存器,其中一个是堆栈指针,占用另一个作为帧指针意味着占用了 25% 的寄存器空间。将这一比例改为 12.5%,是一个相当大的改进。当然,64 位编译也会有很大帮助。

Most smaller functions don't need a frame pointer - larger functions MAY need one.

It's really about how well the compiler manages to track how the stack is used, and where things are on the stack (local variables, arguments passed to the current function and ar

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜流冰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值