【C/C++】inline函式和static函式和巨集定義的比較
inline行內函數
1.行內函數的定義:行內函數是指用inline關鍵字修飾的函式。如果行內函數在類體內定義,不用inline關鍵字宣告,預設為行內函數。
2.行內函數在函式呼叫點展開,沒有棧幀的開闢和回退。行內函數函式是在編譯時直接插入函式程式碼的,會增加程式碼大小,但是可以提高執行速度。
3.行內函數不生成符號,僅可以在本檔案可見。
4.如果想在其他檔案使用該行內函數,可以在函式定義處加上extern關鍵字(不推薦)。最好將行內函數寫在.h檔案中。
5.inline函式和static函式和巨集定義的比較:
inline
本檔案可見
不產生符號
沒有棧幀的開闢,在呼叫點展開。(debug版本下同樣具有棧幀開闢和回退,方便除錯。release版本下沒有)
static
本檔案可見
產生一個local的符號(本地符號,連結過程中不進行處理。連結處理的是global符號。)
有棧幀的開闢
巨集函式
本檔案可見
不產生符號
在呼叫點展開(預編譯期)
沒有型別檢查
無法除錯
6.行內函數和普通函式的區別:
(1)普通函式在被呼叫的時候,系統首先要到函式的入口地址去執行函式體,執行完成之後再回到函式呼叫的地方繼續執行,函式始終只有一個複製;行內函數不需要定址,當執行到行內函數的時候,將此函式展開,如果程式中有N次呼叫了行內函數則會有N次展開函式程式碼。行內函數與普通函式相比,可以加快程式的執行速度,因為不需要中斷呼叫,在編譯的時候行內函數可以直接鑲嵌到目的碼中。
(2)行內函數有一定的限制,行內函數體要求程式碼簡單,不能包含複雜的結構控制語句。如果行內函數函式體過於複雜,編譯器將自動把行內函數當成普通函式來執行。
inline一般只用於如下情況:
①一個函式不斷被重複呼叫
②函式只有簡單的幾行,且不包含for、while、switch等語句。
一般而言,寫小程式沒有必要使用inline,但是如果要完成一個工程專案,當一個簡單函式被呼叫多次時,應考慮使用inline。
7.行內函數取代巨集定義:
使用巨集和行內函數都可以節省在函式呼叫方面所帶來的時間和空間開銷。二者都採用了空間換時間的方式,在其呼叫處進行展開。
行內函數要做引數型別檢查,而巨集只是簡單的字元替換。這是行內函數跟巨集相比的優勢。
(1)巨集定義不是函式, 只是在編譯前(編譯預處理階段)將程式中有關字串替換成巨集體。前處理器用複製巨集程式碼的方式代替函式的呼叫,省去了函式壓棧退棧過程,提高了效率;行內函數本質上是一個函式,但在編譯中不單獨產生程式碼,而是將有關程式碼嵌入到呼叫處。
(2)行內函數在執行時可除錯,而巨集定義不可以。
(3)在預編譯時期,巨集定義在呼叫處執行字串的原樣替換;在編譯時期,行內函數在呼叫處展開,同時進行引數型別檢查。
(4)行內函數可以作為某個類的成員函式,這樣可以使用類的保護成員和私有成員。而當一個表示式涉及到類保護成員或私有成員時,巨集就不能實現了(無法將this指標放在合適位置)。即行內函數可以訪問類的成員變數,巨集定義不能。
可以用行內函數完全替代巨集。