內聯函式和巨集函式

2021-09-26 09:06:38 字數 921 閱讀 9229

內聯函式和普通函式的區別:

普通函式呼叫時是生成呼叫指令跳轉(),然後當**執行到呼叫位置時,跳轉到函式所在的**段中執行

而 內聯函式就是直接把函式編譯好的二進位制指令複製到函式的呼叫位置

優點:提高了程式的執行速度(沒跳轉沒返回當然速度快了),但這樣會導致可執行檔案增大(冗餘),也就是犧牲空間來換取時間

顯式內聯:在函式前 inline(c語言c99標準也支援)

隱式內聯:結構、類中內部直接定義的成員函式,則該型別會被優化成內聯函式

巨集函式在呼叫時會把函式體直接替換到呼叫為止,與內聯函式一樣也是使用空間來換取時間

所以這時候就需要看清巨集函式與內聯的區別了,也可以說他們的優缺點:

1、巨集函式不是真正的函式,只是**替換,不會有引數壓棧、出棧以及返回值,也不會檢查引數型別,因此所有型別都可以使用,但這樣會有安全隱患,就是二義性(比如說你把x+y定義成s #define s x+y,題目是x*(x+y),而使用巨集函式就可能寫成xs,那樣結果就是xx+y,這就是二義性)

2、內聯函式時真正的函式,被呼叫時會進行傳參,會進行壓棧、出棧,可以有返回值,並嚴格檢查引數型別,但這樣就不能通用,如果想被多種型別呼叫需要過載

巨集函式是很方便,而且如果小心一點的話就很好用

所以,什麼時候用內聯函式呢:

頻繁呼叫的簡單函式適合作為內聯函式,因為內聯函式會造成可執行函式的變大,並增加記憶體開銷

呼叫少的複雜函式,內聯後並不顯著提高效能,比起犧牲的空間太虧了

還有遞迴特性和動態繫結特性的函式無法實施內聯,因此編譯器會忽略宣告部分的inline關鍵字

然後給個例子

c++類中有宣告且定義的函式就是內聯函式(隱式),類內宣告類外定義且有inline的是內聯函式(顯式)

內聯函式和巨集函式

黑色印記 內聯函式和普通函式相比可以加快程式執行的速度,因為不需要中斷呼叫及返回的過程。在編譯階段內聯函式可以直接被鑲嵌到目標 中。而巨集只是乙個簡單地替換。內聯函式的優勢在於做引數型別檢查,而巨集定義不會。我們知道內聯函式和巨集定義是犧牲記憶體空間換取執行效率的。因此,是否使用內聯函式就要根據實際...

巨集 函式和內聯函式

巨集和函式的區別 1.巨集做的是簡單的字串替換 注意是字串的替換,不是其他型別引數的替換 而函式的引數的傳遞,引數是有資料型別的,可以是各種各樣的型別.2.巨集的引數替換是不經計算而直接處理的,而函式呼叫是將實參的值傳遞給形參,既然說是值,自然是計算得來的.3.巨集在編譯之前進行,即先用巨集體替換巨...

巨集和函式和內聯函式

巨集和函式的區別 巨集做的是簡單的字串替換 注意是字串的替換,不是其他型別引數的替換 而函式的引數的傳遞,引數是有資料型別的,可以是各種各樣的型別.巨集的引數替換是不經計算而直接處理的,而函式呼叫是將實參的值傳遞給形參,既然說是值,自然是計算得來的.巨集在編譯之前進行,即先用巨集體替換巨集名,然後再...