在这种情况下,像GCC这样的现代编译器会执行尾部优化吗?

时间:2017-03-11 06:55:57

标签: c++ c gcc

假设我有这样的功能:

int recursivefunction (int n) {
    if (n>10) return n; /* terminal case */
    elseif (n>5) return n*recursivefunction(n-1); /* non tail call*/
    else return recursivefunction(n-1); /* tail call

第三次递归调用是否会被优化为尾调用?如果不是为什么不呢? 我们可以用清除当前函数堆栈框架的汇编代码替换第三个return语句,除了传递给下一个调用的局部变量,以及转到函数的地址,这样就不会保留堆栈上的空间。 / p>

1 个答案:

答案 0 :(得分:0)

可能,虽然不能保证。

如果n小于或者equsl为5,则代码不是无限循环,但计算INT_MIN-1时的最终下溢是未定义行为。如果编译器发现它,它可以做任何事情,包括返回42或其他一些不可指定的值而不进行任何调用。第二次递归调用也是如此,因为它必须很快落入第三次递归调用。

简而言之,如果参数值小于或等于10,则编译器没有约束,因为任何这些情况最终都会执行其行为未定义的计算。所以编译器有权假设程序员将确保只使用大于10的参数调用该函数。如果是这种情况,该函数只是身份函数,因此编译器可能会删除所有递归调用,尾部位置或不。