我请谷歌给我gcc选项-fomit-frame-pointer的含义,它将我重定向到下面的声明.

-fomit-frame-pointer

对于不需要帧指针的函数,不要将帧指针保存在寄存器中.这避免了保存、设置和恢复帧指针的指令;它还可以在许多功能中使用额外的寄存器.这也使得在某些机器上无法进行调试.

根据我对每个函数的了解,将在进程内存堆栈中创建一个激活记录,以保存所有局部变量和更多信息.我希望这个帧指针意味着函数激活记录的地址.

在这种情况下,它不需要将帧指针保存在寄存器中的函数类型是什么?如果我获得此信息,我将try 基于此设计新函数(如果可能),因为如果帧指针没有保存在寄存器中,一些指令将以二进制形式省略.这将在功能众多的应用程序中显著提高性能.

推荐答案

大多数较小的函数不需要帧指针——较大的函数可能需要帧指针.

它实际上是关于编译器如何很好地跟踪堆栈的使用情况,以及堆栈上的内容(局部变量、传递给当前函数的参数以及为即将调用的函数准备的参数).我认为描述需要或不需要帧指针的函数并不容易(从技术上讲,任何函数都不需要帧指针——这更像是"如果编译器认为有必要降低其他代码的复杂性").

我认为您不应该将"try 使函数没有帧指针"作为您的编码策略的一部分-就像我说过的,简单的函数不需要它们,所以使用-fomit-frame-pointer,您将为寄存器分配器多获得一个寄存器,并将进入/退出函数的1-3条指令保存到函数.如果您的函数需要帧指针,这是因为编译器认为这比不使用帧指针更好.目标不是拥有没有帧指针的函数,而是拥有既正确又快速工作的代码.

请注意,"没有帧指针"应该可以提供更好的性能,但这并不是带来巨大改进的灵丹妙药——尤其是在x86-64上,它已经有了16个寄存器.在32位x86上,因为它只有8个寄存器,其中一个是堆栈指针,而占用另一个作为帧指针意味着占用了25%的寄存器空间.将这一比例改为12.5%是相当大的进步.当然,64位编译也会有很大帮助.

C++相关问答推荐

“C”中函数内部的数据操作

C 和 Rust 代码片段之间的不同行为

C中的外部/全局变量

我可以在同一个文件中使用 time.h 中的两个 tm 结构吗?

CS50:滤镜边缘主要返回白色图像

为什么我不能将动态函数指针传递给 atexit()?

我们可以使用变量根据需要给出数组中元素的数量吗?

GNU inline asm:允许不同输出操作数的相同寄存器?

char数组变量在退出函数后被销毁

C printf中的'I'(大写i)标志是什么?

未定义值的索引处的数组值

以编程方式获取缓存行大小?

numpy 怎么这么快?

为什么将 free 的返回值转换为 void?

从函数返回结构时可能出现 GCC 错误

并行将 64 位整数中的压缩 8 位整数减 1,没有硬件 SIMD 的 SWAR

为什么快速整数类型比其他整数类型快?

升级到 Catalina 10.15 后无法在 Mac 上编译 C 程序

即使我将输出重定向到 /dev/null,printf 仍然会产生成本吗?

为什么要在 C 和 C++ 项目中创建 include/ 目录?