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