从这个问题开始:how-do-i-check-if-gcc-is-performing-tail-recursion-optimization,我注意到使用带有-fPIC的gcc似乎会破坏这种优化。我正在创建一个共享库,但我似乎不需要-fPIC选项。
好吧,我的问题是,为什么-fPIC会改变gcc优化?我是否需要出于任何原因保留-fPIC?
答案 0 :(得分:4)
如果没有目标架构和编译器版本等细节,可能的解释是:
在位置相关的代码中,尾递归优化本质上是重用当前的堆栈帧,并用call
替换所考虑的jump
。语法可能由call function
替换为jmp <small offset of function>
。
在与位置无关的代码中,如果指令集允许,则可以将调用写为call function@PLT
(此示例为amd64)。它完全可以被jmp <small offset of function>@PLT
取代,但是这两个设置确实存在干扰,并且gcc开发人员可能无法在后一种模式下实现尾调用优化。
答案 1 :(得分:2)
在ia32 linux中,使用fpic意味着您没有可用于通用目的的ebx,这肯定会影响优化。由于寄存器调度压力,编译器可能决定不进行尾递归优化。