C 學習記錄6 內聯函式分析

2021-09-05 10:26:12 字數 1525 閱讀 1442

c++中const常量可以代替巨集常數定義;使用內聯函式替代巨集**片段。

c++中標推薦使用內聯函式代替巨集**片段。

c++中使用inline關鍵字宣告內聯函式。

內聯函式宣告時inline關鍵字必須和函式定義結合在一起,否則編譯器會直接忽略內聯請求。

函式呼叫時,會有引數入棧、函式返回、棧變數的銷毀等等的開銷,而巨集**塊則沒有。(內聯函式取兩者的優點)

內聯函式的表現形式和普通函式是一樣的,但是會被編譯器進行優化。將內聯函式的函式體進行擴充套件(不是文字替換,不是預處理器完成),是由編譯器直接將編譯生成的**進行拓展,到呼叫內聯函式的地方,即可進行引數檢查等工作。

關鍵字inline

是對編譯器的一種請求,對函式體的內容進行內聯編譯。請求是否成功不一定。

c++編譯器可以將乙個函式進行內聯編譯。編譯器直接將內聯函式的函式體拓展到函式呼叫的地方。內聯函式沒有普通函式呼叫時的額外開銷(壓棧、跳轉、返回)。

內聯函式特點: 1

)內聯函式具有普通函式的特徵(引數檢查,返回型別等); 2

)函式的內聯請求可能被編譯器拒絕; 3

)函式被內聯編譯後,函式體直接拓展到呼叫的地方;

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

(在c++

開發中,首選內聯函式)

為什麼內聯請求會被拒絕? 現代

c++編譯器能夠進行編譯優化,一些函式即使沒有

inline

,也可能內聯編譯。

一些現代

c++編譯器提供了拓展語法,能夠對函式進行

強制內聯

,如:

上圖所示為關鍵字,代替

inline

使用。

程式示例

#include //__forceinline

//__attribute__((always_inline))

inline

int add_inline(int n);

int main(int argc, char *argv)

inline int add_inline(int n)

{ int ret = 0;

for(int i=0; i注意事項:(

c++中

inline內聯編譯的限制)(對於現在來講大多數已經不是問題)

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

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

3)函式體不能過於龐大;

4)不能對函式進行取址操作;

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

C 深度剖析學習總結 6 內聯函式分析

c 深度剖析學習總結 6 內聯函式分析 1.c 中的const常量可以替代巨集常數定義,如 const int a 3 define a 3 c 中是否有解決方案替代巨集 片段呢?有,內聯函式 2.內聯函式 c 中推薦使用內聯函式替代巨集 片段 c 中使用inline關鍵字宣告內聯函式 inline...

內聯函式分析

1 內聯函式 1 c 中 const 可以代替巨集常量定義。如 const int a 3 define a 3 既然const 可以代替 巨集常量 的定義 是否有其他辦法代替 巨集 呢?有,內聯函式。2 內聯函式。1 c 中推薦使用內聯函式代替巨集 片段。2 c 中使用 inline 關鍵字宣告內...

C 第6課 內聯函式分析

本文學習自 狄泰軟體學院 唐佐林老師的 c 課程 引入 c 內聯函式的引入是為了替換c中巨集 塊功能 實驗1 巨集 塊 vs 內聯函式 注意 在c 開發中首選內聯函式定義 塊,而不是巨集實驗2 強制內聯 c語言中的巨集常量只是在預處理期間進行鍵的文字替換,它的 是並不會進行任何的語法檢查,型別檢查。...