天天看點

内聯函數相關知識總結

内聯函數和static的差別

1)内聯函數沒有清棧開銷,static有清棧開銷;

2)inline因為變異階段代碼展開,函數檔案可見

static 符号屬性為l(local)本檔案可見

内聯函數和宏的差別

内聯函數和普通函數相比可以加快程式的速度,因為不需要中斷調用,在編譯的時候内聯函數可以直接鑲嵌在目标代碼中。而宏隻是一個簡單的替換。

内聯函數要做參數類型檢查,這是内聯函數和宏相比的優勢。

inline是指嵌入代碼,就是在調用函數的時候不是跳轉,而是直接把代碼寫到那裡去。對于短小代碼來書inline增加空間消耗換來的是效率的提高,這方面是和宏一樣的,的那好似inline在和宏相比沒有付出任何代價的情況下更安全。

inline一般隻用于如下情況

(1)一個函數不斷重複被調用。

(2)函數隻有簡單幾行,且函數内不包含for,while,switch語句。

宏在c中很重要的但是在c++中就少多了。關于宏的第一規則是絕不應該去使用它,除非你不得不這麼做。

宏的代碼處是不加任何驗證的簡單替代,而内聯函數則是直接将代碼插入調用處,而減少了普通函數調用的資源消耗。

inline必須和函數定義體放在一塊才能使函數稱為内聯,僅将函數放在函數聲明前不起任何作用。

内聯是以代碼膨脹為代價僅僅省去函數調用的開銷,進而提高函數的執行效率。每一處的調用都要複制代碼,将使總代碼量增加,消耗更多的記憶體空間

以下情況不适合使用内聯

1)函數的代碼較長,使用内聯導緻記憶體消耗代價太高

2)函數體内出現循環,那麼執行函數體内的代碼的時間要比函數調用的開銷更大,此外要當心構造函數和析構函數會隐藏一些行為,比如”偷偷的“執行基類或成員對象的構造和析構函數。是以不要随機将構造函數和析構函數的定義體放在類聲明裡。内聯函數隻是給編譯器的一個"建議",一個好的編譯器會取消不值得的内聯。

繼續閱讀