內聯的優缺點

老司機的詩和遠方發表於2020-04-06

定義和機制

行內函數是指用inline關鍵字修飾的函式。在類內定義的函式被預設成行內函數。行內函數從原始碼層看,有函式的結構,而在編譯後,卻不具備函式的性質。
行內函數不是在呼叫時發生控制轉移,而是在編譯時將函式體嵌入在每一個呼叫處。編譯時,類似巨集替換,使用函式體替換呼叫處的函式名。一般在程式碼中用inline修飾,但是能否形成行內函數,需要看編譯器對該函式定義的具體處理。

優點

1、行內函數,編譯器將會根據上下文環境進一步深度優化程式碼,而這一點是普通函式無法達到的作用
2、省略了函式呼叫壓入堆疊和彈出堆疊所用的時間
3、常用於高頻使用的函式,可以提高時間

缺點

1、編譯之後程式碼量會偏多,內聯可以說是一種以空間換取時間的方法。犧牲一定的空間來加速執行時間。增加的程式碼量取決於函式呼叫次數和函式本身的大小
2、行內函數實現的更改往往並不可以保持連結相容性,也就是說這樣的更改需要使用者重新編譯他們的程式碼

綜述與注意

1、inline實現其實就是對編譯器的一種請求,因此編譯器完全有權利取消一個函式的內聯請求。一個好的編譯器會根據函式定義體,自動取消不值得的內聯,一般編譯器會自動過濾選擇一些短小而簡單的函式來內聯
2、使用行內函數的時候要注意:
(1)遞迴函式不能定義為行內函數
(2)行內函數一般適合於不存在while和switch等複雜的結構且只有1~5條語句的小函式上,否則編譯系統將該函式視為普通函式。
(3)行內函數只能先定義後使用,否則編譯系統也會把它認為是普通函式。
(4)對行內函數不能進行異常的介面宣告。

相關文章