-fomit-frame-pointer *总是*省略fp?

时间:2011-02-16 12:14:32

标签: c gcc stackframe mips32

-fomit-frame-pointer 总是省略帧指针?有没有需要设置pc和fp的情况?动态堆栈增长是否会强制设置fp?专门询问MIPS32。谢谢!

3 个答案:

答案 0 :(得分:2)

除了有时异常展开外,正确执行并不需要帧指针。动态堆栈增长通常需要某种帧指针,但它不依赖于特定的寄存器,而是通过正常的数据流分析进行分配。

基本上,-fomit-frame-pointer将FP从固定寄存器赋值降级为伪寄存器,并使初始化受到死存储消除的影响。所以第一个问题的答案是否定的,它并不总是省略它。

答案 1 :(得分:1)

不,通常不需要帧指针。编译器可以访问相对于堆栈指针的局部变量,并且不需要特殊的帧指针。

然而,标准帧指针设置序列可以帮助调试崩溃的程序(即使没有用-g编译),因为调试器可以使用帧指针信息来重建调用堆栈。如果没有帧指针,它就没有信息可以确定一个堆栈帧的开始位置和下一个堆栈帧的结束位置。

因此,当使用-fomit-frame-pointer时,如果发生崩溃,您将在更高难度的调试中交易性能。如果你的代码的性能关键部分是小的循环并且不调用任何函数,那么省略帧指针也不会带来任何好处。

答案 2 :(得分:0)

不是mips人,而是适用于任何系统的东西:如果堆栈需要在任何点对齐,则需要使用一个帧来存储原始指针(因为堆栈地址和对齐可能不是知道)