# gcc -fomit-frame-pointer -o main main.c
大多数较小的函数不需要帧指针,而较大的函数可能需要。
这实际上取决于编译器如何跟踪堆栈的使用情况,以及堆栈上的位置(局部变量、传递给当前函数的参数,以及为即将被调用的函数准备的参数)。我认为要确定哪些函数需要或不需要帧指针并不容易(从技术上讲,没有哪个函数必须有帧指针--更多的情况是 “如果编译器认为有必要使用帧指针来降低其他代码的复杂性”)。
我不认为你应该把 “试图让函数不需要框架指针 ”作为编码策略的一部分--就像我说的,简单的函数不需要框架指针,所以使用-fomit-frame-pointer,你就能为寄存器分配器多获得一个可用寄存器,并在函数的进入/退出时节省 1-3 条指令。如果你的函数需要框架指针,那是因为编译器认为这比不使用框架指针更好。我们的目标不是让函数不使用帧指针,而是让代码既能正确运行又能快速运行。
需要注意的是,“不使用帧指针 ”应该会带来更好的性能,但这并不是什么能带来巨大改进的灵丹妙药,尤其是在 x86-64 上,因为它一开始就已经有 16 个寄存器了。在 32 位 x86 上,由于只有 8 个寄存器,其中一个是堆栈指针,占用另一个作为帧指针意味着占用了 25% 的寄存器空间。将这一比例改为 12.5%,是一个相当大的改进。当然,64 位编译也会有很大帮助。
Most smaller functions don't need a frame pointer - larger functions MAY need one.
It's really about how well the compiler manages to track how the stack is used, and where things are on the stack (local variables, arguments passed to the current function and ar

最低0.47元/天 解锁文章
402

被折叠的 条评论
为什么被折叠?



