Ham*_*aya 2 c++ gcc tail-recursion tail-call-optimization
下面是一个以编程方式为玩具编程语言生成的片段,实际代码不同,但下面显示了它在执行时的作用,
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所以必须有办法强迫这个?
小智 6
如果没有尾调用,如何消除尾调用?它只是一个尾调用,如果它是在a之前完成的最后一件事return- 但你要调用它两次,将结果存储在某处,添加它们然后你返回.所以:一般来说,没有.
如果该方法不是虚拟的(即GCC可以肯定这里只有一个实现fibo这就是所谓的),它可能仍然能够优化它(至少它为一个用户提供免费的功能),但你必须要测试它并且可能不应该依赖它.将递归转换为尾递归通常是程序员的工作.
| 归档时间: |
|
| 查看次数: |
819 次 |
| 最近记录: |