gpt4 book ai didi

c - 试图了解gcc选项-fomit-frame-pointer

转载 作者:行者123 更新时间:2023-12-02 10:26:24 25 4
gpt4 key购买 nike

我要求Google给我gcc选项-fomit-frame-pointer的含义,该选项将我重定向到以下语句。

-fomit-frame-pointer

Don't keep the frame pointer in a register for functions that don't need one. This avoids the instructions to save, set up and restore frame pointers; it also makes an extra register available in many functions. It also makes debugging impossible on some machines.


据我对每个功能的了解,将在过程存储器的堆栈中创建一个激活记录,以保留所有局部变量和更多信息。我希望该帧指针表示功能激活记录的地址。
在这种情况下,什么类型的函数不需要将帧指针保留在寄存器中?如果获得此信息,我将尝试基于此设计新功能(如果可能的话),因为如果帧指针未保存在寄存器中,则某些指令将以二进制形式省略。在具有许多功能的应用程序中,这确实可以显着提高性能。

最佳答案

大多数较小的功能不需要框架指针-较大的功能可能需要一个框架指针。

真正的问题在于编译器如何很好地跟踪堆栈的使用方式以及堆栈中的内容(局部变量,传递给当前函数的参数以及为即将被调用的函数准备的参数)。我认为很难描述需要或不需要帧指针的函数(从技术上讲,没有函数必须具有帧指针-而是“如果编译器认为有必要降低函数的复杂性,其他代码”)。

我不认为您应该“尝试使函数没有框架指针”作为您的编码策略的一部分-就像我说的那样,简单的函数不需要它们,因此请使用-fomit-frame-pointer,您将再获得一个注册可用于寄存器分配器,并在函数进入/退出时保存1-3条指令。如果您的函数需要帧指针,那是因为编译器认为这是比不使用帧指针更好的选择。没有框架指针的功能不是目标,而拥有能够正确且快速运行的代码不是目标。

请注意,“没有帧指针”应该会提供更好的性能,但这并不是可以带来巨大改进的魔术子弹,尤其是x86-64上已经没有16个寄存器了。在32位x86上,由于它只有8个寄存器,其中一个是堆栈指针,而占用另一个作为帧指针意味着占用了25%的寄存器空间。将其更改为12.5%是一个很大的进步。当然,为64位编译也将有很大帮助。

关于c - 试图了解gcc选项-fomit-frame-pointer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64317827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com