調(diào)用函數(shù)時需要一定的時間和空間的開銷。函數(shù)調(diào)用過程如下:
1.程序先執(zhí)行函數(shù)調(diào)用之前的語句;
2.調(diào)用函數(shù),流程控制轉(zhuǎn)移到被調(diào)用函數(shù)的入口處,同時進行參數(shù)傳遞;
3.執(zhí)行被調(diào)用函數(shù)中函數(shù)體的語句;
4.流程返回調(diào)用函數(shù)的下一條指令處,將函數(shù)返回值帶回;
5.接著執(zhí)行主調(diào)函數(shù)中未執(zhí)行的語句。
這樣就要求在轉(zhuǎn)到被調(diào)用函數(shù)之前,需要動態(tài)分配內(nèi)存(動態(tài)存儲區(qū)),記下當時執(zhí)行的指令地址,還要“保護現(xiàn)場”(記下當時有關信息),以便在函數(shù)調(diào)用之后繼續(xù)執(zhí)行。函數(shù)調(diào)用之后,流程返回到當前記下的地址,并且根據(jù)記下的信息進行“恢復現(xiàn)場”,然后繼續(xù)執(zhí)行,這都需要花費一定時間。如果有的函數(shù)需要頻繁調(diào)用,則所用時間會很長,從而降低程序執(zhí)行效率。有些程序?qū)π适怯幸蟮模笙到y(tǒng)的響應時間短,這就希望盡量壓縮時間的開銷。
C++提供一種提高效率的方法,即在編譯時將所調(diào)用函數(shù)的代碼直接嵌入到主調(diào)函數(shù)中,而不是將流程轉(zhuǎn)出去。這種嵌入到主調(diào)函數(shù)中的函數(shù)稱為內(nèi)置函數(shù)(內(nèi)聯(lián)函數(shù))。
定義方法:只需在函數(shù)左邊加一個關鍵字inline即可。
例如:inline int max(int, int, int )
注意:可以在聲明函數(shù)和定義函數(shù)時同時使用inline,也可以在其中一處聲明inline,效果相同,都能按內(nèi)置函數(shù)處理。
說明:使用內(nèi)置函數(shù)可以節(jié)省運行時間,但是卻增加了目標程序的長度。因此,一般只將規(guī)模很小而使用頻繁的函數(shù)(如定時采集數(shù)據(jù)的函數(shù))聲明為內(nèi)置函數(shù)。在函數(shù)規(guī)模很小情況下,函數(shù)調(diào)用的時間開銷可能相當于甚至超過執(zhí)行函數(shù)本身的時間,把它定義為內(nèi)置函數(shù),可大大減少程序運行時間。
說明:對函數(shù)作inline聲明,只是程序設計者對編譯系統(tǒng)提出的一個建議,也就是說它是建議性的,而非指令性的。編譯系統(tǒng)會根據(jù)具體情況決定是否這樣做。
禁忌:內(nèi)置函數(shù)中不能包括復雜的控制語句,如循環(huán)語句、switch語句。
inline intmax(int,int, int);//聲明內(nèi)置函數(shù),左端inline
int main()
{
int i = 3, j = 5, k =8, m;
m = max(i, j, k);/*max函數(shù)體的代碼替換 m = max(i, j, k),同時形參代替實參
則 m = max(i, j, k)被替換為
if(j>i); i=j
if(k>i); i=k
m=i;*/
cout << "max=" << m = endl;
return 0;
}
inline intmax(int a,int b, int c);//定義max為內(nèi)置函數(shù)
{
if (b > a)
a = b;
if (c > a)
a = c;
return a;
}
新聞熱點
疑難解答
圖片精選