针对以下情况的海湾合作委员会尾部呼叫优化

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这就是所谓的),它可能仍然能够优化它(至少它为一个用户提供免费的功能),但你必须要测试它并且可能不应该依赖它.将递归转换为尾递归通常是程序员的工作.