天天看點

解析宏函數與内聯函數

一、宏函數的優點

不會進行傳參、入棧、出棧,以及函數調用時的跳轉,是以執行速度比正常函數要快

二、宏函數的缺點

不檢查資料類型,沒有傳回值,僅有一個運作結果,每使用一次就會把表達展開一次,會造成代碼段的備援,導緻可執行檔案變大,而且宏函數容易出現二義性(會根據參數的不同、環境不同發生變化)

三、内聯函數的優點

提高程式的運作速度(因為沒有跳轉,也不需要傳回)

四、内聯函數的缺點

會導緻可執行檔案增大(備援),也就是犧牲空間來換取時間

五、為什麼内聯函數會提高程式運作速度

普通函數調用時是生成調用指令(跳轉),然後當代碼執行到調用位置時跳轉到函數所在的代碼段中執行,内聯函數就把函數編譯好的二進制指令直接複制到函數的調用位置,是以提高了程式運作的速度

六、顯示内聯與隐式内聯

顯式内聯:在函數前 inline(C語言C99标準也支援,inline是建議性關鍵字,當請求将函數作為内聯函數時,編譯器并不一定會滿足這種要求)

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

七、内聯函數适用的條件

1、由于内聯會造成可執行檔案變大,并增加記憶體開銷,是以隻有頻繁調用的簡單函數适合作為内聯函數

2、調用比較少的複雜函數,内聯後并不顯著提高性能,不足以抵消犧牲空間帶來的損失,是以不适合内聯

3、帶有遞歸特性和動态綁定特性的函數,無法實施内聯,是以編譯器會忽略聲明部分的inline關鍵字

六、内聯函數和宏函數的差別

1、展開的時間不同,内聯函數在編繹時展開,宏在預編譯時展開

2、編譯内聯函數可以嵌入到目标代碼,宏隻是簡單文本替換

3、内聯會做類型,文法檢查,而宏不具這樣功能

4、宏不是函數,内聯函數是函數

5、宏定義小心處理宏參數(一般參數要括号起來),否則易出現二義性,而内聯定義不會出現

繼續閱讀