1. 程式人生 > >論述含引數的巨集與函式的優缺點。

論述含引數的巨集與函式的優缺點。

1.函式呼叫時,先求出實參表示式的值,然後帶入形參。而使用帶參的巨集只是進行簡單的字元替換。

2.函式呼叫是在程式執行時處理的,分配臨時的記憶體單元;而巨集展開則是在編譯時進行的,在展開時並不分配記憶體單元,不進行值的傳遞處理,也沒有“返回值”的概念。

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

4.呼叫函式只可得到一個返回值,而用巨集可以設法得到幾個結果。

5.使用巨集次數多時,巨集展開後源程式長,因為每展開一次都使程式增長,而函式呼叫不使源程式變長。

6.巨集替換不佔執行時間,只佔編譯時間;而函式呼叫則佔執行時間(分配單元、保留現場、值傳遞、返回)。

一般來說,用巨集來代表簡短的表示式比較合適。

另外,行內函數和巨集的區別:

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

轉自:http://hi.baidu.com/%BB%F0%C9%F1%C7%FA/blog/item/2741d7d138f1b922960a1603.html