先轉(zhuǎn)載下人家總結(jié)的宏和普通函數(shù)調(diào)用的區(qū)別:
(1)、宏只做簡(jiǎn)單的字符串替換,函數(shù)是參數(shù)傳遞,所以必然有參數(shù)類(lèi)型檢查(支持各種類(lèi)型,而不是只有字符串)。
(2)、宏不經(jīng)計(jì)算而直接替換參數(shù),函數(shù)調(diào)用則是將參數(shù)表達(dá)式求值再傳遞給形參。
(3)、宏在編譯前進(jìn)行,即先替換再編譯。而函數(shù)是編譯后,在執(zhí)行時(shí)才調(diào)用的。宏占編譯時(shí)間,而函數(shù)占執(zhí)行時(shí)間。
(4)、宏參數(shù)不占空間,因?yàn)橹蛔鲎址鎿Q,而函數(shù)調(diào)用時(shí)參數(shù)傳遞是變量之間的傳遞,形參作為局部變量占內(nèi)存空間。
(5)、函數(shù)調(diào)用需要保留現(xiàn)場(chǎng),然后轉(zhuǎn)入調(diào)用函數(shù)執(zhí)行,執(zhí)行完畢再返回主調(diào)函數(shù),這些耗費(fèi)在宏中是沒(méi)有的。
使用宏和內(nèi)聯(lián)函數(shù)都可以節(jié)省在函數(shù)調(diào)用方面的時(shí)間和空間開(kāi)銷(xiāo)。二者都是為了提高效率,但是卻有著顯著的區(qū)別:
(1)、在使用時(shí),宏只做簡(jiǎn)單的預(yù)處理器符號(hào)表(字符串)中的簡(jiǎn)單替換。而內(nèi)聯(lián)函數(shù)可以進(jìn)行參數(shù)類(lèi)型檢查,且具有返回值(也能被強(qiáng)制轉(zhuǎn)換為可轉(zhuǎn)換的合適類(lèi)型)。
(2)、內(nèi)聯(lián)函數(shù)首先是函數(shù),函數(shù)的許多性質(zhì)都適用于內(nèi)聯(lián)函數(shù)(如內(nèi)聯(lián)函數(shù)可以重載)。
(3)、內(nèi)聯(lián)函數(shù)可以作為某個(gè)類(lèi)的成員函數(shù),這樣可以使用類(lèi)的保護(hù)成員和私有成員。而當(dāng)一個(gè)表達(dá)式涉及到類(lèi)保護(hù)成員或私有成員時(shí),宏就不能實(shí)現(xiàn)了(無(wú)法將this指針?lè)旁诤线m位置)。
可以用內(nèi)聯(lián)函數(shù)完全替代宏。
但是在使用內(nèi)聯(lián)函數(shù)時(shí)也要注意:作為內(nèi)聯(lián)函數(shù),函數(shù)體必須十分簡(jiǎn)單,不能包含循環(huán),條件,選擇等復(fù)雜結(jié)構(gòu),否則不能作為內(nèi)聯(lián)函數(shù)。
實(shí)際上,編譯器的優(yōu)化系統(tǒng)會(huì)自動(dòng)將一些簡(jiǎn)單函數(shù)變成內(nèi)聯(lián)函數(shù)。而一些復(fù)雜的函數(shù),即使指定為內(nèi)聯(lián),編譯器也會(huì)自動(dòng)當(dāng)作普通函數(shù)。
文章出處:DIY部落(http://www.diybl.com/course/3_program/c++/cppxl/20081216/154041.html)