內聯函數與宏函數的區別

內聯函數


概念

以inline修飾的函數叫做內聯函數,編譯時C++編譯器會在調用內聯函數的地方展開,沒有函數壓棧的開銷,內聯函數提升程序運行的效率


特性

  1. inline是一種以空間換時間的做法,省去調用函數額開銷。所以代碼很長或者有循環/遞歸的的函數不適宜使用內聯
    2.inline對於編譯器而言只是一個建議,編譯器會自動優化,如果定義爲inline的函數體內有循環/遞歸等等,編譯器優化時會忽略掉內聯
    3.inline必須函數定義放在一起,才能成爲內聯函數,僅將inline放在聲明前是不起作用的
    4.定義在類內的成員函數默認定義爲內聯函數

注意事項

在C++中,強制建議使用const代替宏常量,使用內聯函數代替宏函數,const和內聯函數在進行編譯時不僅進行替換,而且還會進行參數類型檢測,提高了程序的安全性。內斂函數可以是普通函數,也可以是類的成員函數;函數式宏不能作爲類的成員函數.



宏的相關知識點


宏函數與普通函數對比


優點:宏函數在預處理期間會進行宏替換,沒有函數壓棧開銷,運行效率高。
缺點:

1.不安全(不會進行類型檢測)
2.代碼複用率不高
3.不停的進行替換,增長代碼長度
4.不能調試


宏和內聯函數的區別


1.內聯函數採用的是值傳遞,而宏定義採用的是對等替換.
2.宏是由預處理器對宏進行替代,而內聯函數是通過編譯器控制來實現的。而且內聯函數是真正的函數,只是在需要用到的時候,內聯函數像宏一樣的展開,所以取消了函數的參數壓棧,減少了調用的開銷
3.編譯器在調用一個內聯函數時,會首先檢查它的參數的類型,保證調用正確。然後進行一系列的相關檢查,就像對待任何一個真正的函數一樣。這樣就消除了它的隱患和侷限性。


相關鏈接


注意事項:
1.在內聯函數內不允許用循環語句和開關語句和遞歸。
2.內聯函數的定義必須出現在內聯函數第一次被調用之前。


define與const的區別


a.用#define MAX 255定義的常量是沒有類型的,所給出的是一個立即數,編譯器只是把所定義的常量值與所定義的常量的名字聯繫起來,define所定義的宏變量在預處理的時候進行替換,在程序中使用到該常量的地方都要進行拷貝替換;
b.用const float MAX = 255; 定義的常量有類型名字,存放在內存的靜態區域中,在程序運行過程中const變量只有一個拷貝,而#define 所定義的宏變量卻有多個拷貝,所以宏定義在程序運行過程中所消耗的內存要比const變量的大得多;
c.用define定義的常量是不可以用指針變量去指向的,用const定義的常量是可以用指針去指向該常量的地址的;
d.用define可以定義一些簡單的函數,const是不可以定義函數的.


具體來說,有以下幾方面的區別:
1.編譯器處理方式
define – 在預處理階段進行替換
const – 在編譯時確定其值
2.類型檢查
define – 無類型,不進行類型安全檢查,可能會產生意想不到的錯誤
const – 有數據類型,編譯時會進行類型檢查
3.內存空間
define – 不分配內存,給出的是立即數,有多少次使用就進行多少次替換,在內存中會有多個拷貝,消耗內存大
const – 在靜態存儲區中分配空間,在程序運行過程中內存中只有一個拷貝
4.其他

a.在編譯時, 編譯器通常不爲const常量分配存儲空間,而是將它們保存在符號表中,這使得它成爲一個編譯期間的常量,沒有了存儲與讀內存的操作,使得它的效率也很高。
b.宏替換隻作替換,不做計算,不做表達式求解。
c.宏定義的作用範圍僅限於當前文件。
d.默認狀態下,const對象只在文件內有效,當多個文件中出現了同名的const變量時,等同於在不同文件中分別定義了獨立的變量。 如果想在多個文件之間共享const對象,必須在變量定義之前添加extern關鍵字(在聲明和定義時都要)。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章