2

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

4

3 回答 3

4

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

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

于 2011-02-16T13:46:43.600 回答
2

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

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

因此,在使用时,-fomit-frame-pointer您是在用性能换取更困难的调试,以防崩溃。如果您的代码的性能关键部分是较小的循环并且不调用任何函数,那么省略帧指针也不会带来什么好处。

于 2011-02-16T17:06:11.840 回答
0

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

于 2011-02-16T16:30:50.043 回答