2009-11-17 86 views
3

以下从这个问题:how-do-i-check-if-gcc-is-performing-tail-recursion-optimization,我注意到使用gcc与-fPIC似乎破坏这种优化。我正在创建一个共享库,但我似乎不需要-fPIC选项。gcc -fPIC似乎与优化标志粪土

那么,我的问题是,为什么-fPIC更改gcc优化?我是否需要为任何原因保留-fPIC?

+0

您能提供重现您所描述行为的方法吗?这听起来不对。但是,执行'gcc'的一些内部限制可能会强制禁用PIC模式下的优化... – 2009-11-17 08:03:42

+0

哪个版本的GCC?哪个平台? '-fPIC'有时会将生成的代码更改为'位置独立代码'(即PIC),这意味着它可能与“位置相关代码”不同。你使用什么选项? – 2009-11-17 08:23:11

+0

啊,在我们的64位服务器gcc sais上需要-fPIC。 – user212658 2009-11-17 08:39:40

回答

4

在不存在细节,诸如目标体系结构和编译器版本,一个可能的解释是这样的:

在依赖于位置的代码,所述尾递归优化基本上重复使用当前堆栈帧,以及替换考虑calljump。语法可以是call function替换为jmp <small offset of function>

在与位置无关的代码中,如果指令集允许它(本例为amd64),则可以将调用写入call [email protected]。它可以很好地替换为jmp <small offset of function>@PLT,但这两个设置确实会发生干扰,也许gcc开发人员没有考虑在后一种模式下实现尾部呼叫优化。

2

在ia32 linux中,使用fpic意味着你没有可用于通用目的的ebx,这肯定会影响优化。由于注册调度压力,编译器可能决定拒绝尾部递归优化。