我试图搜索,但无法找到:函数的必要条件是什么,以便gcc优化尾递归?是否有任何参考或列表包含最重要的案例?由于这是版本特定的,我的兴趣是4.6.3或更高版本(越新越好)。但事实上,任何具体的参考资料都将受到高度赞赏。
提前致谢!
答案 0 :(得分:13)
启用-O2
后,如果可能,gcc将执行尾调用优化。现在,问题是:什么时候可能?
只要在(单个)return
语句之前或之内发生递归调用,就可以消除单个递归调用,因此除了之后没有可观察到的副作用可能会返回不同的值。这包括返回涉及三元运算符的表达式
请注意,即使在返回表达式中有几个递归调用(例如在众所周知的斐波纳契示例中:return (n==1) ? 1 : fib(n-1)+fib(n-2);
),仍然会应用尾调用递归,但仅适用于最后的递归电话。
作为一个明显的特殊情况,如果编译器可以证明递归函数(及其参数)有资格作为常量表达式,它可以(最多可配置的最大递归深度,默认为500)不仅消除尾调用,但整个执行功能。这是GCC在-O2
时常规且非常可靠的事情,甚至包括对文字的strlen
等某些库函数的调用。