解析巨集函式與內聯函式

2021-09-27 15:49:18 字數 921 閱讀 8517

一、巨集函式的優點

不會進行傳參、入棧、出棧,以及函式呼叫時的跳轉,因此執行速度比正常函式要快

二、巨集函式的缺點

不檢查資料型別,沒有返回值,僅有乙個執行結果,每使用一次就會把表達展開一次,會造成**段的冗餘,導致可執行檔案變大,而且巨集函式容易出現二義性(會根據引數的不同、環境不同發生變化)

三、內聯函式的優點

提高程式的執行速度(因為沒有跳轉,也不需要返回)

四、內聯函式的缺點

會導致可執行檔案增大(冗餘),也就是犧牲空間來換取時間

五、為什麼內聯函式會提高程式執行速度

普通函式呼叫時是生成呼叫指令(跳轉),然後當**執行到呼叫位置時跳轉到函式所在的**段中執行,內聯函式就把函式編譯好的二進位制指令直接複製到函式的呼叫位置,所以提高了程式執行的速度

六、顯示內聯與隱式內聯

顯式內聯:在函式前 inline(c語言c99標準也支援,inline是建議性關鍵字,當請求將函式作為內聯函式時,編譯器並不一定會滿足這種要求)

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

七、內聯函式適用的條件

1、由於內聯會造成可執行檔案變大,並增加記憶體開銷,因此只有頻繁呼叫的簡單函式適合作為內聯函式

2、呼叫比較少的複雜函式,內聯後並不顯著提高效能,不足以抵消犧牲空間帶來的損失,所以不適合內聯

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

六、內聯函式和巨集函式的區別

1、展開的時間不同,內聯函式在編繹時展開,巨集在預編譯時展開

2、編譯內聯函式可以嵌入到目標**,巨集只是簡單文字替換

3、內聯會做型別,語法檢查,而巨集不具這樣功能

4、巨集不是函式,內聯函式是函式

5、巨集定義小心處理巨集引數(一般引數要括號起來),否則易出現二義性,而內聯定義不會出現

函式 內聯函式與巨集

一 內聯函式與巨集的區別 內聯函式和巨集很類似,而區別在於,巨集是由預處理器對巨集進行替代,而內聯函式是通過編譯器控制來實現的。而且內聯函式是真正的函式,只是在需要用到的時候,內聯函式像巨集一樣的展開,所以取消了函式的引數壓棧,減少了呼叫的開銷。你可以象呼叫函式一樣來呼叫內聯函式,而不必擔心會產生於...

巨集與內聯函式

函式作為一種抽象機制,對解決大型複雜問題起到了很大作用。但是,由於函式呼叫時需要開銷的,例如,函式呼叫時需要保護呼叫者的執行環境,進行引數傳遞,執行呼叫命令,為區域性變數分配空間以及執行返回指令等,因此函式會帶來程式執行效率的下降,特別是對一些小函式的頻繁呼叫。c 提供了兩種解決上述問題的辦法 巨集...

巨集與內聯函式

建議 1 使用const定義常量而不是 define 2 使用inline內聯函式而不是 define來定義小型函式 第一部分 巨集 為什麼要使用巨集呢?因為函式的呼叫 必須要將程式執行的順序轉移到函式所存放在記憶體中的某個位址,將函式的程式內容執行完後,再返回到轉去執行該函式前的地方。這種轉移操作...