1.函數(shù)調(diào)用原理
"編譯過程的最終產(chǎn)品是可執(zhí)行程序--由一組機(jī)器語言指令組成。運(yùn)行程序時(shí),操作系統(tǒng)將這些指令載入計(jì)算機(jī)內(nèi)存中,因此每條指令都有特定的內(nèi)存地址。計(jì)算機(jī)隨后將逐步執(zhí)行這些指令。有時(shí)(如有循環(huán)和分支語句時(shí)),將跳過一些指令,向前或向后跳到特定地址。常規(guī)函數(shù)調(diào)用也使程序跳到另一個(gè)地址(函數(shù)的地址),并在函數(shù)結(jié)束時(shí)返回。下面更詳細(xì)地介紹這一過程的典型實(shí)現(xiàn)。執(zhí)行到函數(shù)調(diào)用指令時(shí),程序?qū)⒃诤瘮?shù)調(diào)用后立即存儲(chǔ)該指令的內(nèi)存地址,并將函數(shù)參數(shù)復(fù)制到堆棧(為此保留的內(nèi)存塊),跳到標(biāo)記函數(shù)起點(diǎn)的內(nèi)存單元,執(zhí)行函數(shù)代碼(也許還需將返回值放入寄存器中),然后跳回到地址被保存的指令處(這與閱讀文章時(shí)停下來看腳注,并在閱讀完腳注后返回到以前閱讀的地方類似)。來回跳躍并記錄跳躍位置意味著以前使用函數(shù)時(shí),需要一定的開銷。"
2.內(nèi)聯(lián)函數(shù)
內(nèi)聯(lián)函數(shù)提供了另一種選擇。編譯器將使用相應(yīng)的函數(shù)代碼替換函數(shù)調(diào)用。因此,內(nèi)聯(lián)函數(shù)的運(yùn)行速度比常規(guī)函數(shù)稍快,但代價(jià)是需要占用更多內(nèi)存。
3.內(nèi)聯(lián)函數(shù)的使用
在函數(shù)聲明前加上關(guān)鍵字inline;
在函數(shù)定義前加上關(guān)鍵字inline。
示例如下:
#include<iostream>inline double square(double x){return x*x;}int main(){ using namespace std; double a,b; double c = 13.0; a = square(5.0); b = square(4.5+7.5); cout<<"a="<<a<<",b="<<b<<endl; cout<<"c="<<c<<endl; cout<<"c squared="<<square(c++)<<endl; cout<<"now c="<<c<<endl; return 0;}
程序輸出結(jié)果如下:
a=25,b=144
c=13
c square=169
now c=14
4.內(nèi)聯(lián)函數(shù)與宏定義的區(qū)別
C語言使用預(yù)處理器語句#define來提供宏。如下例所示:
#define SQUARE(X) X*X
宏定義時(shí)通過文本替換開實(shí)現(xiàn)的--X是參數(shù)的符號(hào)標(biāo)記。
a = square(5.0);->a=5.0*5.0;
b = square(4.5+7.5);->b=4.5+7.5*4.5+7.5
d = square(c++);->d=c++*c++
可以看出,對(duì)于b,需要使用括號(hào)才能正常運(yùn)算。
#define SQUARE(X) ((X)*(X))
對(duì)于c,卻仍遞增了兩次。
因此,宏定義和內(nèi)聯(lián)函數(shù)存在本質(zhì)的區(qū)別,轉(zhuǎn)換的時(shí)候應(yīng)考慮是否轉(zhuǎn)換后功能是否正常。
5.什么時(shí)候使用內(nèi)聯(lián)函數(shù)
如果執(zhí)行函數(shù)代碼的時(shí)間比處理函數(shù)調(diào)用機(jī)制的時(shí)間長(zhǎng),則節(jié)省的時(shí)間占比很小。若代碼執(zhí)行時(shí)間很短,則內(nèi)聯(lián)函數(shù)就可以節(jié)省函數(shù)調(diào)用的時(shí)間。
參考資料:《C++ Primer.Plus》 pp.253-255
聯(lián)系客服