gcc/g ++中的尾递归

dtl*_*rek 8 recursion gcc tail-recursion compiler-optimization

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

提前致谢!

Dam*_*mon 13

-O2启用,GCC将执行尾调用优化,如果可能的话.现在,问题是:什么时候可能?

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

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