2010-04-29 115 views
0

我很困惑如何在C++中做內聯函數....C++內聯函數

讓我們說這個函數。會是怎樣變成一個內聯函數

int maximum(int x, int y, int z) 
{ 
    int max = x; 
    if (y > max) 
     max = y; 
    if (z > max) 
     max = z; 
    return max; 
} 
+7

PUT「內聯」函數定義的前面。 – 2010-04-29 16:36:06

+3

您還必須將函數定義放在標題中(或者使其在每個翻譯單元中都可用)。 – 2010-04-29 16:43:09

+3

請記住,「inline」關鍵字通常對函數是否內聯無效,使用任何合理的現代編譯器,只要所有的定義是相同的(例如,如果它是「內聯」的,你可以在多個頭文件中定義它),那麼它將允許你在多個地方定義函數。 – 2010-04-29 16:44:35

回答

4

正如其他人所說,你可以使用inline關鍵字來告訴你希望你的函數內聯的編譯器。但inline關鍵字只是編譯器提示。如果需要或需要,編譯器可以並且會選擇忽略您的請求。

另一種方法是使你的函數的函數模板,往往會被吹出來的直列:

template<class Val> 
Val maximum(Val x, Val y, Val z) 
{ 
    Val max = x; 
    if (y > max) 
     max = y; 
    if (z > max) 
     max = z; 
    return max; 
} 
+1

功能模板不一定是內嵌展開的。 – sbi 2010-04-29 16:52:30

+2

Niether是'inline'函數。這只是一種替代方法。 – 2010-04-29 16:55:13

+0

澄清措辭。 – 2010-04-29 16:55:50

4

要發佈尼爾斯答案爲實際答案:

inline int maximum(int x, int y, int z) 
.... 
1

inline只是告訴你要到處複製的功能代碼是refernece編譯器,它使代碼更快一些(沒有函數調用開銷),但更大(代碼被複制)。 This page is more in depth.

+0

而且編譯器並不需要實際內聯它,如果它不'我覺得很喜歡它。所以它可能會或可能不會幫助。 – 2010-04-29 16:56:42

3

如果該函數定義出現在class {}定義中,則它已自動內聯。

否則,正如別人所說,把inline盈方。

8

爲了把它變成你需要做兩件事情的內聯函數:內聯用關鍵字inline

  1. 聲明。
  2. 確保該函數的定義在使用它的每個翻譯單元中都可見。這通常意味着您必須將該函數的整個定義放入一個頭文件中。
2

爲了使功能內嵌使用inline關鍵字:

inline int maximum(int x, int y, int z) // note the inline keyword 
{ 
    int max = x; 
    if (y > max) 
     max = y; 
    if (z > max) 
     max = z; 
    return max; 
} 

如果函數是一個類/結構中的一員,然後簡單地定義它裏面的類(如並列到外面)使得它一致。

假設你有電話:

int f = maximum(3, 4, 5) 

編譯器可能會調用擴展到類似:

int max = x; 
if (y > max) 
    max = y; 
if (z > max) 
    max = z; 
int z = max; 

有一些開銷來調用一個函數,所以內聯函數給您帶來的便利函數以及C宏的性能。但這並不是說你應該總是使用它們,在大多數情況下,編譯器會更好地決定何時需要這樣的優化,甚至可能不會滿足您的請求。

你可以閱讀更多關於內聯函數和如何(何時)在C++ FAQ Lite使用它們,這GotW