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

2021-09-12 12:01:28 字數 3194 閱讀 7506

【c++深度剖析學習總結】 6 內聯函式分析

1.c++中的const常量可以替代巨集常數定義,如:

const int a = 3; #define a 3

c++中是否有解決方案替代巨集**片段呢?

有,內聯函式

2.內聯函式

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

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

inline

intfunc

(int a,

int b)

內聯函式宣告時inline關鍵字必須和函式定義結合在一起,否則編譯器會直接忽略內聯請求。c++編譯器可以將乙個函式進行內聯編譯

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

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

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

c++編譯器不一定滿足函式的內聯請求

實驗1 內聯函式

#include

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

inline

intfunc

(int a,

int b)

intmain

(int argc,

char

*ar**)

直接執行結果:**的是2 3 2問題是巨集**塊是有***的,可以使用內聯函式

這個時候使用vs的反彙編功能

轉到反彙編

從反彙編可見,實際是沒有同意請求的內聯函式修改方式:這個是可以在軟體內修改的

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

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

函式被內聯編譯後,函式體直接擴充套件到呼叫的地方

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

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

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

g++

:_attribute_

((always_inline)

)屬性msvc:_forceinline

6-2 內聯函式示例

#include

//__forceinline

//__attribute__((always_inline))

inline

intadd_inline

(int n)

;int

main

(int argc,

char

*ar**)

inline

intadd_inline

(int n)

return ret;}/*

r = 45

*/

3.注意事項c++中inline內聯編譯的限制

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

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

函式體不能過於龐大

不能對函式進行取值操作

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

小結

c++中可以通過inline宣告內聯函式

編譯器直接將內聯函式體擴充套件到函式呼叫的地方

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

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

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

c 中const常量可以代替巨集常數定義 使用內聯函式替代巨集 片段。c 中標推薦使用內聯函式代替巨集 片段。c 中使用inline關鍵字宣告內聯函式。內聯函式宣告時inline關鍵字必須和函式定義結合在一起,否則編譯器會直接忽略內聯請求。函式呼叫時,會有引數入棧 函式返回 棧變數的銷毀等等的開銷,...

C 第6課 內聯函式分析

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

第6課 內聯函式分析

帶參函式巨集內聯函式 優點編譯器會做引數的靜態型別檢查 原地展開,沒有呼叫開銷 並且在預處理階段完成,不占用編譯時間。函式 被裝入符號表中,在使用時進行替換 沒有呼叫開銷,效率高,會進行引數型別檢查 缺點需要傳參 棧變數的開闢和銷毀 壓棧 跳轉 返回開銷 不進行型別檢查,多次巨集替換會導致 體積變大...