gcc / g ++中的尾递归

时间:2013-04-09 08:52:37

标签: gcc recursion compiler-optimization tail-recursion

我试图搜索,但无法找到:函数的必要条件是什么,以便gcc优化尾递归?是否有任何参考或列表包含最重要的案例?由于这是版本特定的,我的兴趣是4.6.3或更高版本(越新越好)。但事实上,任何具体的参考资料都将受到高度赞赏。

提前致谢!

1 个答案:

答案 0 :(得分:13)

启用-O2后,如果可能,gcc将执行尾调用优化。现在,问题是:什么时候可能?

只要在(单个)return语句之前或之内发生递归调用,就可以消除单个递归调用,因此除了之后没有可观察到的副作用可能会返回不同的值。这包括返回涉及三元运算符的表达式 请注意,即使在返回表达式中有几个递归调用(例如在众所周知的斐波纳契示例中:return (n==1) ? 1 : fib(n-1)+fib(n-2);),仍然会应用尾调用递归,但仅适用于最后的递归电话。

作为一个明显的特殊情况,如果编译器可以证明递归函数(及其参数)有资格作为常量表达式,它可以(最多可配置的最大递归深度,默认为500)不仅消除尾调用,但整个执行功能。这是GCC在-O2时常规且非常可靠的事情,甚至包括对文字的strlen等某些库函数的调用。