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

时间:2011-05-10 12:02:14

标签: 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所以必须有办法强迫这个吗?

1 个答案:

答案 0 :(得分:6)

如果没有尾调用,如何消除尾调用?如果它是在return之前完成的最后一件事,它只是一个尾调用 - 但你要调用它两次,将结果存储在某处,添加它们然后然后你返回。所以:一般来说,没有。

如果该方法不是虚拟的(即GCC可以确定只有一个被调用的fibo实现),那么可能仍然可以对其进行优化(至少它适用于one user with a free function),但你必须测试它,并且不应该依赖它。将递归转换为尾递归通常是程序员的工作。