內聯函數和帶參數的宏的區別

(1)、內聯函數

當程序執行函數調用時,系統要建立棧空間,保護現場,傳遞參數以及控制程序執行的轉移等等,這些工作需要系統時間和空間的開銷。有些情況下,函數本身功能簡單,代碼很短,但使用頻率卻很高,程序頻繁調用該函數所花費的時間卻很多,從而使得程序執行效率降低。


爲了提高效率,一個解決辦法就是不使用函數,直接將函數的代碼嵌入到程序中,可以使用帶參數的宏定義實現,但是這種方法也有缺點,程序可讀性往往沒有使用函數的好,如果缺少了一些括號還可能出現歧義。


爲了協調好效率和可讀性之間的矛盾,C++提供了另一種方法,即定義內聯函數,方法是在定義函數時用修飾詞inline。inline關鍵字告訴編譯器,這個函數的調用要儘可能快,可以當普通的函數調用實現,也可以用宏展開的辦法實現。在C99也引入了inline 關鍵字。


(2)、內聯函數和帶參數的宏的區別

inline int max(int a, int b)
{
return a > b ? a : b;
}

#define MAX(a, b)  ((a) > (b) ? (a) : (b))


內聯函數調用時,要求實參和形參的類型一致,另外內聯函數會先對實參表達式進行求值,然後傳遞給形參;如果實參表達式有Side Effect,那麼這些SideEffect只發生一次。例如MAX(++a, ++b),如果MAX是個真正的函數,a和b只增加一次。而宏調用時只用實參簡單地替換形參;如果MAX是上面那樣的宏定義,則要展開成k = ((++a)>(++b)?(++a):(++b)),a和b 增加的次數就難說了。


內聯函數是在編譯的時候、在調用的地方將代碼展開的,而參數宏則是在預處理時進行替換的,故生成的目標文件都比較大。


在C++中建議採用inline函數來替換帶參數的宏

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