以下从这个问题:how-do-i-check-if-gcc-is-performing-tail-recursion-optimization,我注意到使用gcc与-fPIC似乎破坏这种优化。我正在创建一个共享库,但我似乎不需要-fPIC选项。gcc -fPIC似乎与优化标志粪土
那么,我的问题是,为什么-fPIC更改gcc优化?我是否需要为任何原因保留-fPIC?
以下从这个问题:how-do-i-check-if-gcc-is-performing-tail-recursion-optimization,我注意到使用gcc与-fPIC似乎破坏这种优化。我正在创建一个共享库,但我似乎不需要-fPIC选项。gcc -fPIC似乎与优化标志粪土
那么,我的问题是,为什么-fPIC更改gcc优化?我是否需要为任何原因保留-fPIC?
在不存在细节,诸如目标体系结构和编译器版本,一个可能的解释是这样的:
在依赖于位置的代码,所述尾递归优化基本上重复使用当前堆栈帧,以及替换考虑call
由jump
。语法可以是call function
替换为jmp <small offset of function>
。
在与位置无关的代码中,如果指令集允许它(本例为amd64),则可以将调用写入call [email protected]
。它可以很好地替换为jmp <small offset of function>@PLT
,但这两个设置确实会发生干扰,也许gcc开发人员没有考虑在后一种模式下实现尾部呼叫优化。
在ia32 linux中,使用fpic意味着你没有可用于通用目的的ebx,这肯定会影响优化。由于注册调度压力,编译器可能决定拒绝尾部递归优化。
您能提供重现您所描述行为的方法吗?这听起来不对。但是,执行'gcc'的一些内部限制可能会强制禁用PIC模式下的优化... – 2009-11-17 08:03:42
哪个版本的GCC?哪个平台? '-fPIC'有时会将生成的代码更改为'位置独立代码'(即PIC),这意味着它可能与“位置相关代码”不同。你使用什么选项? – 2009-11-17 08:23:11
啊,在我们的64位服务器gcc sais上需要-fPIC。 – user212658 2009-11-17 08:39:40