2

下面是一个为玩具编程语言以编程方式生成的片段,实际代码不同,但以下显示了它在执行时的作用,



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,所以必须有办法强制这样做吗?

4

1 回答 1

6

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

如果该方法不是虚拟的(即 GCC 可以确定只有一个fibo被调用的实现),它可能仍然能够优化它(至少它对一个具有免费功能的用户有效),但你必须测试它并且可能不应该依赖它。将递归变为尾递归通常是程序员的工作。

于 2011-05-10T12:07:11.387 回答