行內函數

通常,如果為函式生成的程式碼足夠小,那麼它是內聯的一個很好的候選者。為什麼這樣?如果函式很大並且在迴圈中內聯,則對於所有呼叫,大函式的程式碼將被複制,從而導致生成的二進位制大小膨脹。但是,有多小就足夠了?

雖然行內函數似乎是避免函式呼叫開銷的好方法,但需要注意的是,並非所有標記為 inline 的函式都是內聯的。換句話說,當你說 inline 時,它只是對編譯器的一個暗示,而不是一個順序:編譯器沒有義務行內函數,它可以自由地忽略它 - 大多數都可以。現代編譯器更好地進行這樣的優化,使得這個關鍵字現在成為過去的遺蹟,當程式設計師對函式內聯的這一建議被編譯器認真對待時。即使是未標記為 inline 的函式也會被編譯器內聯,因為它看到了這樣做的好處。

內聯作為連線指令

inline 在現代 C++中更實際的用途來自於將其用作連結指令。當定義 (而不是宣告)標題中將包含在多個源中的函式時,每個翻譯單元將擁有其自己的此函式副本,從而導致 ODR (一個定義規則)違規; 這個規則粗略地說只有一個函式,變數等的定義。為了避免這種違規,標記函式定義 inline 隱式地使函式連結內部。

常見問題解答

我應該何時在 C++中為函式/方法編寫關鍵字’inline’?

僅當你希望在標題中定義函式時。更確切地說,只有當函式的定義可以顯示在多個編譯單元中時。最好在標頭檔案中定義小(如在一個線性中)函式,因為它為編譯器提供了更多資訊,以便在優化程式碼時使用。它還會增加編譯時間。

什麼時候不應該為 C++中的函式/方法編寫關鍵字’inline’?

如果編譯器內聯它,你認為程式碼執行得更快時,請不要新增 inline

什麼時候編譯器不知道何時使函式/方法內聯?

通常,編譯器將能夠比你更好地完成此操作。但是,如果編譯器沒有函式定義,則編譯器無法內聯程式碼。在最大限度優化的程式碼中,無論你是否要求,通常都會內聯所有私有方法。

也可以看看