2013-03-28 68 views
6

如果您啓用了在你的編譯器全面優化和上課的設置是這樣的:C++:函數包裝器是否可以使用內聯?

class A 
{ 
    void Do_A_Stuff(); 
}; 
class B 
{ 
    A a; 
    void Do_B_Stuff() { a.Do_A_Stuff(); } 
}; 
class C 
{ 
    B b; 
    void Do_C_Stuff() { b.Do_B_Stuff(); } 
}; 
class D 
{ 
    C c; 
    void Do_D_Stuff() { c.Do_C_Stuff(); } 
}; 

是否有過在那裏打電話Do_D_Stuff()會比直接調用Do_A_Stuff()慢的情況?另外,這是否需要每個包裝器'鏈'上的inline關鍵字,或者,因爲這只是一個建議,編譯器是否可以決定優化這個關鍵字?

我意識到有很多關於內聯可用的信息,但是我找不到任何有關將多個封裝鏈接在一起的具體信息。

回答

7

此外,這是否需要每個包裝'鏈'上的inline關鍵字,或者,因爲它只是一個建議,編譯器是否可以決定優化這個沒有關鍵字?

是,編譯器可以決定無論如何要優化它,它也可以決定即使您指定的inline關鍵字(如果適當的編譯器選項被設置可能產生一個警告),以優化它 - 通知,在類定義中定義的成員函數被隱式標記爲inline

一般來說,如果內聯是可能的,編譯器會根據被調用函數的主體來決定是否內聯。但是,如果函數是虛函數,或者函數的定義對編譯器不可見,則內聯可能根本不可能。

如果滿足內聯條件並且編譯器認爲它合適,那麼函數調用鏈內聯就沒有技術問題。

作爲次要說明,請注意您的類中的函數應爲public,否則它們將無法訪問您的包裝。

+0

是的,這些功能應該是「公開」的,我只是爲了簡潔起見。 :) – Jonathan

+0

*「或者如果函數的定義對編譯器不可見。」* - 這是否適用於[鏈接時間代碼生成](http://msdn.microsoft.com/zh-cn/library/xbf3tbeh (v = vs80).aspx)在MSVC(或其他編譯器中的等效)?我一直對此很好奇。 – JBentley

+1

@JBentley:跨模塊內聯也是可能的,是的。還有[您可以檢查的相關問答](http://stackoverflow.com/questions/5987020/can-the-linker-inline-functions)。謝謝你的評論 –

0

這些函數是在類定義中定義的,所以在這種情況下隱含關鍵字inline

+1

應該指出的是,即使在類定義之外使用'inline'也不能保證編譯器會'內聯'你的代碼。由編譯器來決定。 – Tushar

+0

編譯器可能內聯沒有標記爲「inline」的函數,也不能標記爲「inline」的內聯函數。 – GManNickG

相關問題