C 中巨集定義和內聯函式區別

2021-09-26 16:36:33 字數 1152 閱讀 2715

一、巨集定義和內聯函式的區別

1. 巨集定義不是函式,但是使用起來像函式。預處理器用複製巨集**的方式代替函式的呼叫,省去了函式壓棧退棧過程,提高了效率。

內聯函式本質上是乙個函式,內聯函式一般用於函式體的**比較簡單的函式,不能包含複雜的控制語句,while、switch,並且內聯函式本身不能直接呼叫自身。如果內聯函式的函式體過大,編譯器會自動的把這個內聯函式變成普通函式。

2. 巨集定義是在預編譯的時候把所有的巨集名用巨集體來替換,簡單的說就是字串替換

內聯函式則是在編譯的時候進行**插入,編譯器會在每處呼叫內聯函式的地方直接把內聯函式的內容展開,這樣可以省去函式的呼叫的開銷,提高效率

3. 巨集定義是沒有型別檢查的,無論對還是錯都是直接替換

內聯函式在編譯的時候會進行型別的檢查,內聯函式滿足函式的性質,比如有返回值、引數列表等

4. 巨集定義和內聯函式使用的時候都是進行**展開。不同的是巨集定義是在預編譯的時候把所有的巨集名替換,內聯函式則是在編譯階段把所有呼叫內聯函式的地方把內聯函式插入。這樣可以省去函式壓棧退棧,提高了效率

二、內聯函式和普通函式的區別

1. 內聯函式和普通函式的引數傳遞機制相同,但是編譯器會在每處呼叫內聯函式的地方將內聯函式內容展開,這樣既避免了函式呼叫的開銷又沒有巨集機制的缺陷

2. 普通函式在被呼叫的時候,系統首先要到函式的入口位址去執行函式體,執行完成之後再回到函式呼叫的地方繼續執行,函式始終只有乙個複製。

內聯函式不需要定址,當執行到內聯函式的時候,將此函式展開,如果程式中有n次呼叫了內聯函式則會有n次展開函式**

3. 內聯函式有一定的限制,內聯函式體要求**簡單,不能包含複雜的結構控制語句。如果內聯函式函式體過於複雜,編譯器將自動把內聯函式當成普通函式來執行

//

// main.cpp

// c++test20

////

#include using namespace std;

class a

// 隱式內斂函式

};//函式定義為inline即:內聯函式

inline int inlinetest(int a, int b)

inline string dbtest(int a)

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

巨集定義和內聯函式區別

內聯函式是 被插入到呼叫者 處的函式。如同 define 巨集,內聯函式通過避免被呼叫的開銷來提高執行效率,尤其是它能夠通過呼叫 過程化整合 被編譯器優化。巨集定義不檢查函式引數,返回值什麼的,只是展開,相對來說,內聯函式會檢查引數型別,所以更安全。內聯函式和巨集很類似,而區別在於,巨集是由預處理器...

C 內聯函式和巨集定義

預備知識 c c 編譯過程 step1 預處理 由預處理器 乙個簡單的程式 將程式設計師通過預處理器指令 參考部落格 c c 預處理器指令c c 預處理指令 定義好的模式代替源 中的模式。step2 第一遍編譯 對預處理過的 進行語法分析,編譯器把源 分解成小的單元並把它們按樹形結構組織起來。比如表...

內聯函式和巨集定義的區別

是否是函式 是否具有型別檢查 發生替換的階段 巨集定義和內聯函式使用的時候都是進行 展開。巨集做的是簡單的字串替換 注意是字串的替換,不是其他型別引數的替換 而函式的引數的傳遞,引數是有資料型別的,可以是各種各樣的型別.巨集的引數替換是不經計算而直接處理的,而函式呼叫是將實參的值傳遞給形參,既然說是...