1. 程式人生 > >函數式宏定義和自定義函數的區別是什麽?

函數式宏定義和自定義函數的區別是什麽?

是什麽 定義函數 生成 簡單 ack 系列 line ping sim

自定義函數:

技術分享圖片

宏函數

技術分享圖片

(1)函數式宏定義的參數沒有類型,預處理器只負責做形式上的替換,而不做參數類型檢查,所以危險性高;但因為省去了函數的調用,返回,釋放,所以效率比自定義函數高;

(2)調用真正函數的代碼和調用函數式宏定義的代碼編譯生成的指令不同。

如果MAX是個普通函數,那麽它的函數體return a > b ? a : b; 要編譯生成指令,代碼中出現的每次調用也要編譯生成傳參指令和call指令。而如果MAX是個函數式宏定義,這個宏定義本身倒不必編譯生成指令,但是代碼中出現的每次調用編譯生成的指令都相當於一個函數體,而不是簡單的幾條傳參指令和call指令。所以,使用函數式宏定義編譯生成的目標文件會比較大。

(3)在執行復雜功能時,如遞歸,函數式宏定義往往會導致較低的代碼執行效率。

盡管函數式宏定義和普通函數相比有很多缺點,但只要小心使用還是會顯著提高代碼的執行效率,畢竟省去了分配和釋放棧幀、傳參、傳返回值等一系列工作,因此那些簡短並且被頻繁調用的函數經常用函數式宏定義來代替實現。

函數式宏定義和自定義函數的區別是什麽?