我请谷歌给我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++相关问答推荐

使用sd-设备列举设备导致seg错误

Pure Win32 C(++)-除了替换控件的窗口程序之外,还有其他方法可以在输入时禁用按钮吗?

为什么在传输 Big Data 时共享内存段的运行时间比管道更长?

从STdin读写超过4096个字节

为什么在4.9.37版的内核中,kfio还需要smp_wmb呢?

空指针的运行时强制转换

如何创建一个C程序来存储5种动物的名字,并在用户 Select 其中任何一种动物时打印内存地址?

这个计算C中阶乘的函数正确吗?

使用TCL C API导航到列表中的元素

使用nmake for程序比Hello World稍微复杂一些

收到不兼容的指针类型警告,因为函数的返回不是空*,而是 struct 指针

Valgrind用net_pton()抱怨

具有正确标头的C struct 定义问题

有没有办法减少C语言中线程的堆大小?

如何在MSVC中使用intSafe.h函数?

在Ubuntu上使用库部署C程序的最佳实践

在分配内存后使用指针是未定义的行为吗?

如何为avr atmega32微控制器构建C代码,通过光电二极管捕获光强度并通过串行通信传输数据

保存有符号整数结果的变量是否会溢出(后增量的副作用),并且此后从未在任何表达式中使用过它,是否会导致 UB?

c中数组上显示的随机元素