2011-05-10 55 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