深入理解C++中內聯inline函數和宏定義的區別


inline函數是C++引入的機制,目的是解決使用宏定義的一些缺點。

內聯函數與宏定義區別

(1)內聯函數在編譯時展開,宏在預編譯時展開;

(2)內聯函數直接嵌入到目標代碼中,宏是簡單的做文本替換;

(3)內聯函數有類型檢測、語法判斷等功能,宏沒有;

(4)inline函數是函數,宏不是;

(5)宏定義時要注意書寫(參數要括起來)否則容易出現歧義,內聯函數不會產生歧義;

為什么要引入內聯函數?

用內聯函數替代宏定義,消除宏定義的缺點:

  • 宏定義使用預處理器實現,做一些簡單的字符替換,因此不能進行參數有效性的檢測。
  • 宏定義的返回值不能被強制轉換為可轉換的合適類型。
  • C++中引入了類及類的訪問控制,在涉及到類的保護成員和私有成員就不能用宏定義來操作。

inline相比宏定義有哪些優越性

(1)inline函數代碼是被放到符號表中,使用時像宏一樣展開,沒有調用的開銷,效率很高;

(2)inline函數是真正的函數,所以要進行一系列的數據類型檢查;

(3)inline函數作為類的成員函數,可以使用類的保護成員及私有成員;

inline函數使用的場合

(1)使用宏定義的地方都可以使用inline函數;

(2)作為類成員接口函數來讀寫類的私有成員或者保護成員;

為什么不能把所有的函數寫成inline函數?

內聯函數以代碼復雜為代價,它以省去函數調用的開銷來提高執行效率。
一方面如果內聯函數體內代碼執行時間相比函數調用開銷較大沒有太大的意義;
另一方面每一處內聯函數的調用都要復制代碼,消耗更多的內存空間,因此以下情況不宜使用內聯函數:

(1)函數體內的代碼比較長,將導致內存消耗代價;

(2)函數體內有循環,函數執行時間要比函數調用開銷大;

參考

https://www.cnblogs.com/evenleee/p/10970320.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM