inline內聯函式

2021-07-03 04:24:52 字數 1094 閱讀 8553

demo

//帶引數的巨集

#define myfunc(a, b) ((a) < (b) ? (a) : (b))

inline int myfunc(int a, int b)

int main1402()

說明1:

必須inline int myfunc(int a, int b)和函式體的實現,寫在一塊

說明2c++編譯器可以將乙個函式進行內聯編譯

被c++編譯器內聯編譯的函式叫做內聯函式

內聯函式在最終生成的**中是沒有定義的

c++編譯器直接將函式體插入在函式呼叫的地方

內聯函式沒有普通函式呼叫時的額外開銷(壓棧,跳轉,返回)

說明3:c++編譯器不一定准許函式的內聯請求!

說明4:

內聯函式是一種特殊的函式,具有普通函式的特徵(引數檢查,返回型別等)

內聯函式是對編譯器的一種請求,因此編譯器可能拒絕這種請求

內聯函式由 編譯器處理,直接將編譯後的函式體插入呼叫的地方

巨集**片段 由預處理器處理, 進行簡單的文字替換,沒有任何編譯過程

說明5:

現代c++編譯器能夠進行編譯優化,因此一些函式即使沒有inline宣告,也可能被編譯器內聯編譯

另外,一些現代c++編譯器提供了擴充套件語法,能夠對函式進行強制內聯

如:g++中的__attribute__((always_inline))屬性

說明6:

c++中內聯編譯的限制:

不能存在任何形式的迴圈語句

不能存在過多的條件判斷語句

函式體不能過於龐大

不能對函式進行取址操作

函式內聯宣告必須在呼叫語句之前

編譯器對於內聯函式的限制並不是絕對的,內聯函式相對於普通函式的優勢只是省去了函式呼叫時壓棧,跳轉和返回的開銷。

因此,當函式體的執行開銷遠大於壓棧,跳轉和返回所用的開銷時,那麼內聯將無意義。

結論:1)內聯函式在編譯時直接將函式體插入函式呼叫的地方

2)inline只是一種請求,編譯器不一定允許這種請求

3)內聯函式省去了普通函式呼叫時壓棧,跳轉和返回的開銷

inline 內聯函式

一 inline關鍵字用來定義乙個類的內聯函式,引入它的主要原因是用它替代c中表示式形式的巨集定義。表示式形式的巨集定義一例 define expressionname var1,var2 var1 var2 var1 var2 為什麼要取代這種形式呢,且聽我道來 1 首先談一下在c中使用這種形式巨...

inline內聯函式

技術類筆試題50 都會問巨集與inline的區別,自己去找找看?1 巨集替換發生在預編譯 2 巨集函式 如果可以這麼叫的話 替換時不會檢查引數,inline函式會檢查 3 巨集一定會發生替換,inline貌似不是強制的,編譯器想不替換也沒關係 4 巨集替換時存在著一些不可避免的陷阱 參見c trap...

inline內聯函式

一 內聯函式 內聯函式是指用inline關鍵字修飾的函式 它與普通函式所不同之處只在於函式呼叫的處理。普通 函式進行呼叫時,要將程式執行權轉到被呼叫函式中,然後再返回到呼叫它的函式中 內聯函式不是在呼叫時發生執行權轉移,而是在編譯時將 函式 體 嵌入在每乙個呼叫處。編譯時類似巨集替換,使用 函式體替...