【C++】內聯函數(inline)和宏定義(# define)的優劣及其區別


一.宏定義:# define

1.為什么要使用宏?

因為調用宏比調用函數更有效率,函數的調用必須要將程序的執行順序轉移到函數所存放的內存地址中,將函數程序內容執行完后,再返回到執行該函數前的地方,這種轉移操作要求執行前要保存現場並記憶執行地址,轉回后要恢復現場,並按原來保存的地址繼續執行,因此,函數調用有一定的時間和空間的開銷,而宏只是在預處理的地方把代碼展開,不需要額外的時間和空間開銷,所以調用一個宏比調用一個函數更有效率

2.宏定義的最大好處:

宏定義的使用上像一個函數,但不是函數,它使用預處理器實現,沒有了參數壓棧,代碼生成等一系列操作,因此效率很高

3.宏定義的缺點:

1)雖然宏定義類似一個函數,但在使用時,僅僅只是做預處理器符號表中的簡單替換,因此它不能進行參數有效性的檢測,也就不能享受C++編譯器嚴格類型檢查的好處,另外它的返回值也就不能被強制轉換為可轉換的合適類型

2)宏定義不能訪問類的成員變量

3)宏定義使用參數時,是嚴格的替換策略,無論你得參數時是何種形式,在展開代碼中都是用形參數代替實參,這樣,宏定義很容易產生二義性,它的使用就存在一系列的隱患


二.內聯函數:inline

1.內聯函數的介紹:

內聯函數從源代碼層看,有函數結構,而在編譯后,卻不具備函數性質,內聯函數不是在調用時發生控制轉移,而是在編譯時將函數體嵌入每一個調用處,編譯時,類似宏替換,使用函數體替換調用處的函數名,在代碼中用inline關鍵字修飾,在類中聲明的成員函數,自動轉換為內聯函數

1)類中的成員函數默認是內聯函數(要求成員函數沒有循環和遞歸,當其中存在循環的遞歸的時候,編譯器會將其默認為一個普通函數處理)

2)內聯函數不允許有循環或者遞歸語句

3)內聯函數的定義必須出現在第一次調用內聯函數之前

2.內聯函數的優點:

1)有參數類型檢測,更加安全

2)內聯函數是在程序運行時展開,而且是進行參數傳遞

3)inline關鍵字只是對編譯器的一個定義,如果函數本地不符合內聯函數的標准,編譯器就會將這個函數當作是普通函數

3.內聯函數的缺點:

1)因為內聯函數是在調用處展開,所以會使代碼邊長,占用更多內存


三.內聯函數和宏定義的主要區別:

1)內聯函數在運行時可調試,而宏定義不可以

2)編譯器會對內聯函數的參數類型做安全檢查或自動類型轉換,而宏定義則不會

3)內聯函數可以訪問類的成員變量,而宏定義則不能



免責聲明!

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



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