第6課 內聯函式分析

2021-09-26 14:56:38 字數 3478 閱讀 9640

帶參函式巨集內聯函式

優點編譯器會做引數的靜態型別檢查

原地展開,沒有呼叫開銷;

並且在預處理階段完成,不占用編譯時間。

函式**被裝入符號表中,在使用時進行替換;

沒有呼叫開銷,效率高,會進行引數型別檢查

缺點需要傳參、棧變數的開闢和銷毀

壓棧、跳轉、返回開銷;

不進行型別檢查,多次巨集替換會導致**體積變大;

一些引數的***會導致得出錯誤的結果。

函式**較長,使用內聯將消耗過多記憶體;

函式體內有迴圈,執行**的時間比較長。

(1)c++中的const常量可以替代巨集常數定義,如:  const int a = 3; ←→ #define a  3

(2)c++中是否有解決方案,可以用來替代巨集**片段呢?

2.1 內聯函式的定義

(1)c++編譯器可以將乙個函式進行內聯編譯,被c++編譯器內聯編譯的函式叫內聯函式

(2)c++中使用inline關鍵字宣告內聯函式。如:

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

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

2.2 內聯函式的特點

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

(2)c++編譯器直接將內聯函式的函式體插入到函式呼叫的地方

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

(4)c++編譯器也不一定滿足函式的內聯請求,函式的內聯請求可能被編譯器拒絕。

圖1:編譯器拒絕inline請求(仍為函式呼叫)

圖2:函式體被嵌入到呼叫的地方

1 #include 2

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

//msvc下:要讓inline、__forceinline生效必須得做如下的設定:6//

①在"專案" → "配置屬性" → "c/c++" → "優化" → "內聯函式擴充套件"中選擇"只適用於__inline(/ ob1)"7//

②在"配置屬性" → "c/c++" → "常規" → "除錯資訊格式"中選擇"程式資料庫( / zi)"

89 inline int func(int a, int

b)10

1314

int main(int argc, char *ar**)

15

內聯函式初探

2.3 內聯函式與巨集的不同

巨集內聯函式

處理方式預處理器處理,只是進行簡單的文字替換

編譯器處理,會將函式體嵌入到呼叫的地方。

但內聯請求也可能被編譯器拒絕

型別檢查不做型別檢查

具有普通函式的特徵,會進行引數和返回型別的檢查

***

無 2.4 現代c++編譯器對內聯函式的優化

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

(2)一些現代的c++編譯器提供了擴充套件語法,可用下列列關鍵字替代inline來對函式進行強制內聯,如:

① g++:__atrribute__((always_inline))屬性

② msvc:__forceinline

1 #include 23//

msvc2013下:在函式宣告或定義前加inline或__forceinline都可以4//

同時,這兩個的表現行為幾乎一模一樣。只不過__forceinline是ms5//

下的,而inline是標準c++的,可移植性更高。67

//__forceinline8//

__attribute__((always_inline))9//

inline

10int add_inline(int

n);

1112

intmain()

1320

21 __forceinline int add_inline(int

n)22

2930

return

ret;

31 }

內聯函式深度示例

最新的c++編譯器只要函式體不是太誇張都可以強制內聯成功。列出下面這些是因為工作中使用的c++編譯器版本可能較低,無法滿足。

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

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

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

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

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

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

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

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

(4)內聯函式省去了函式呼叫時壓棧跳轉返回的開銷

C 第6課 內聯函式分析

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

inline函式 第6課 內聯函式分析

一 常量與巨集回顧 c 中的const常量可以替代巨集常數定義,如 const int a 3 等價於 define a 3 那麼c 中是否有解決方案替代巨集 片段呢?請看以下內容。二 內聯函式的定義 1 c 中推薦使用內聯函式替代巨集 片段 2 c 中使用inline關鍵字宣告內聯函式 3 內聯函...

內聯函式分析

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