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