1.函式呼叫時,先求出實參表示式的值,然後帶入形參。而使用帶參的巨集只是進行簡單的字元替換。
2.函式呼叫是在程式執行時處理的,分配臨時的記憶體單元;而巨集展開則是在編譯時進行的,在展開時並不分配記憶體單元,不進行值的傳遞處理,也沒有「返回值」的概念。
3.對函式中的實參和形參都要定義型別,二者的型別要求一致,如不一致,應進行型別轉換;而巨集不存在型別問題,巨集名無型別,它的引數也無型別,只是乙個符號代表,展開時帶入指定的字元即可。巨集定義時,字串可以是任何型別的資料。
4.呼叫函式只可得到乙個返回值,而用巨集呼叫可以設法得到幾個結果。
5.使用巨集次數多時,巨集展開後源程式長,因為每展開一次都使程式增長,而函式呼叫不使源程式變長。
6.巨集替換不佔執行時間,只佔編譯時間;而函式呼叫則佔執行時間(分配單元、保留現場、值傳遞、返回)。
一般來說,用巨集來代表簡短的表示式比較合適。
另外,內聯函式和巨集的區別:
內聯函式和巨集很類似,而區別在於,巨集是由預處理器對巨集進行替代,而內聯函式是通過編譯器控制來實現的。而且內聯函式是真正的函式,只是在需要用到的時候,內聯函式像巨集一樣的展開,所以取消了函式的引數壓棧,減少了呼叫的開銷。你可以象呼叫函式一樣來呼叫內聯函式,而不必擔心會產生於處理巨集的一些問題。
當然,內聯函式也有一定的侷限性。就是函式中的執行**不能太多了,如果,內聯函式的函式體過大,一般的編譯器會放棄內聯方式,而採用普通的方式呼叫函式。這樣,內聯函式就和普通函式執行效率一樣了。
內聯函式是不能為虛函式的,但樣子上寫成了內聯的,即隱含的內聯方式。在某種情況下,雖然有些函式我們宣告為了所謂「內聯」方式,但有時系統也會把它當作普通的函式來處理,這裡的虛函式也一樣,雖然同樣被宣告為了所謂「內聯」方式,但系統會把它當然非內聯的方式來處理。
一部分**:
另一部分則是對上邊的一些解釋和整理
含引數的巨集與函式的區別
含引數的巨集與函式的區別 巨集替換不佔執行時間,只佔編譯時間 而函式呼叫則佔執行時間 分配單元 保留現場 值傳遞 返回 所以每次執行都要載入所以執行起來比較慢一些。定義巨集的時候不要在巨集及其引數之間鍵入空格,因為巨集替換的時候會把你不經意打的空格當作巨集的一部分進去。在巨集定義中把每個引數都用括號...
C 中巨集與內聯函式的優缺點
巨集 為什麼要使用巨集呢?因為函式的呼叫必須要將程式執行的順序轉移到函式所存放在記憶體中的某個位址,將函式的程式內容執行完後,再返回到轉去執行該函式前的地方。這種轉移操作要求在轉去執行前要儲存現場並記憶執行的位址,轉回後要恢復現場,並按原來儲存位址繼續執行。因此,函式呼叫要有一定的時間和空間方面的開...
巨集定義的優缺點
在用vc程式設計的時候就會遇到很多巨集定義,尤其是類似 long,lpctstr 等等之類的,它們屬於微軟的自定義型別,但其本質上還是屬於c c 裡面的那幾個標準型別。那用巨集定義到底有什麼好處呢?先來看一下巨集的定義 用 define命令將乙個指定的識別符號 即巨集名 來代表乙個字串。它的一般型式...