天天看點

C++函數調用過程和内置函數詳解

C++函數調用過程和内置函數詳解

       上圖表示 函數調用過程:①程式先執行函數調用之前的語句;②流程的控制轉移到被調用函數入口處,同時進行參數傳遞;③執行被調用函數中函數體的語句;④流程傳回調用函數的下一條指令處,将函數傳回值帶回;⑤接着執行主調函數未執行的語句。

        這樣就要求在轉到被調用函數之前,要 記下當時執行的指令的位址,還要“保護現場”(記下當時有關的資訊),友善在函數調用之後繼續執行。在函數調用之後,流程傳回到先前記下的位址處,并且根據記下的資訊“恢複現場”,然後繼續執行。這一些都會花費一定的時間。如果有的函數需要頻繁的使用,則所用時間會很長,進而降低程式的執行效率。有些實用程式對效率是有要求的,要求系統的響應世間短。這就希望盡量壓縮時間的開銷。

         C++提供了一種提高效率的方法,即在編譯的時候将所調用的代碼直接嵌入到主調函數中,而不是将流程轉出去。這種嵌入到主調函數中的函數稱為 内置函數(inline function),又稱 内嵌函數。有些書把它譯成 内聯函數。

          用法:在函數首行的左端加一個關鍵字inline即可。 執行個體:

#include <iostream>
using namespace std;
inline int max(int,int,int);//聲明函數
int main()
{
	int i = 10;
	int j = 20;
	int k = 30;
	int m;
	m = max(i,j,k);
	cout << "max=" << m << endl;
	return 0;
}
inline int max(int a; int b; int c)//定義max為内置函數
{                                  //求a,b,c中的最大者
	if (b > a)
	{
		a = b;
	}
           

if (c > a){a = c;}return a;}由于定義函數時指定它為内置函數,是以編譯系統在遇到函數調用“max(i,j,k)”時,就用max函數體的代碼代替“max(i,j,k)”,同時将 實參代替形參。這樣程式第10行“m = max(i,j,k);"就被置換成

if(j > i) i = j;
if(k > i) i = k;
m = i;
           

注意,可以在聲明函數和定義函數時同時寫inline,也可以隻是其中一處聲明inline,效果相同,都能按内置函數處理。

        使用内置函數可以節省運作時間,但卻增加了目标程式的長度。假設要調用10次max函數,則編譯時先後10次将max代碼複制并插入main函數,這就增加了目标檔案main函數的長度。是以一般隻将規模很小(一般為5個語句以下)而使用頻繁的函數(如定時采集資料的函數聲明為内置函數)。在函數規模很小的情況下,函數調用的時間開銷可能相當于甚至超過執行函數本身的時間,把它定義為内置函數,可 大大減少程式的運作時間。

        内置函數中不能包括複雜的控制語句,如循環語句和switch語句。

                 對函數做inline聲明,隻是程式設計者對編譯系統提出的一個建議,它是建議性的,而不是指令性的。并非指定為inline,編譯系統必須這樣做。它是根據具體情況決定的。例如對前面提到的包含循環語句和switch語句的函數或一個遞歸函數是無法進行代碼置換的,又如一個1000行的函數,也不太可能在調用點展開。此時編譯系統就會忽略inline聲明,而按普通函數處理。                總結, 隻有規模較小而又頻繁調用的簡單函數,才适合于聲明為inline函數。