論述含參數的宏與函數的優缺點

論述函數的宏及函數的優缺點

1.函數調用時,先求出實參表達式的值,然後帶入形參。而使用帶參的宏只是進行簡單的字符替換。

2.函數調用是在程序運行時處理的,分配臨時的內存單元;而宏展開則是在編譯時進行的,在展開時並不分配內存單元,不進行值的傳遞處理,也沒有“返回值”的概念。

3.對函數中的實參和形參都要定義類型,二者的類型要求一致,如不一致,應進行類型轉換;而宏不存在類型問題,宏名無類型,它的參數也無類型,只是一個符號代表,展開時帶入指定的字符即可。宏定義時,字符串可以是任何類型的數據。

4.調用函數只可得到一個返回值,而用宏可以設法得到幾個結果。

5.使用宏次數多時,宏展開後源程序長,因爲每展開一次都使程序增長,而函數調用不使源程序變長。

6.宏替換不佔運行時間,只佔編譯時間;而函數調用則佔運行時間(分配單元、保留現場、值傳遞、返回)。

一般來說,用宏來代表簡短的表達式比較合適。

 

另外,內聯函數和宏的區別:

內聯函數和宏很類似,而區別在於,宏是由預處理器對宏進行替代,而內聯函數是通過編譯器控制來實現的。而且內聯函數是真正的函數,只是在需要用到的時候,內聯函數像宏一樣的展開,所以取消了函數的參數壓棧,減少了調用的開銷。你可以象調用函數一樣來調用內聯函數,而不必擔心會產生於處理宏的一些問題。
    當然,內聯函數也有一定的侷限性。就是函數中的執行代碼不能太多了,如果,內聯函數的函數體過大,一般的編譯器會放棄內聯方式,而採用普通的方式調用函數。這樣,內聯函數就和普通函數執行效率一樣了。
    內聯函數是不能爲虛函數的,但樣子上寫成了內聯的,即隱含的內聯方式。在某種情況下,雖然有些函數我們聲明爲了所謂“內聯”方式,但有時系統也會把它當作普通的函數來處理,這裏的虛函數也一樣,雖然同樣被聲明爲了所謂“內聯”方式,但系統會把它當然非內聯的方式來處理。

 

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