2011-05-10 75 views
2

下面GCC尾调用优化的是,被编程为玩具编程语言生成的代码段,实际的代码是不同的,但下面显示了执行时确实如此,用于以下情况

 


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

为什么不编译看看? – 2011-05-10 12:04:11

回答

6

如果没有尾部呼叫,它如何消除尾部呼叫?如果这是在return之前完成的最后一件事情,那么这只是一个尾巴呼叫 - 但是您要呼叫两次,将结果存储在某处,然后将它们添加,然后,然后您将返回。所以:一般来说,不。

如果方法不是虚拟的(即GCC可以肯定,只有一个执行fibo这就是所谓的),它可能仍然能够优化它(至少它为one user with a free function),但你必须测试它,并propably不应该依赖它。将递归转换为尾递归通常是程序员的工作。

+1

编译器/解释器在规范中有一些语言需要尾部消除。然而,它仍然是程序员的工作,以确保它是一个尾巴呼叫,而这确实不是。 – 2011-05-10 12:29:47

+0

@Jan:是的。我刚刚意识到最后一句话就是这个原因。改变了我的意思。 – delnan 2011-05-10 12:32:32

+0

@delnan,假设一个不同的功能,一个单一的返回位于尾部?或者更具体地说,我如何提示gcc某些调用应该优化? – 2011-05-10 12:39:02