以下是以编程方式为玩具编程语言生成的代码段,实际代码不同,但以下显示了执行时的操作,
class Base{ };
Base b;
class Derived{
int fibo(int i){
if(i SMALLER 2)
return 1;
else
return (Derived)b.fibo(i-1) + (Derived)b.fibo(i-2);
}
};
//then somewhere in main
b = new Derived();
int i = (Derived)b.fibo(10);
我的问题是GCC是否会考虑将其用于尾部呼叫消除?
编辑:事实证明我对TOC的看法有点缺陷,所以在不同的情况下,一个不同的函数,尾部有一个返回,是否会考虑进行优化?我问的原因是c编译器和AFAIK方案有很多方案要求TOC所以必须有办法强迫这个吗?
答案 0 :(得分:6)
如果没有尾调用,如何消除尾调用?如果它是在return
之前完成的最后一件事,它只是一个尾调用 - 但你要调用它两次,将结果存储在某处,添加它们然后然后你返回。所以:一般来说,没有。
如果该方法不是虚拟的(即GCC可以确定只有一个被调用的fibo
实现),那么可能仍然可以对其进行优化(至少它适用于one user with a free function),但你必须测试它,并且不应该依赖它。将递归转换为尾递归通常是程序员的工作。