1. 程式人生 > >C++行內函數

C++行內函數

對於經常要使用的程式碼段,為了方便使用會將其封裝成函式。然而在呼叫函式時會建立棧幀,增加了額外的開銷。為了節省開銷,在C語言中會使用巨集替換。然而巨集具有一些缺點:

1)不能除錯;

2)由於巨集使用簡單的文字替換,對於有些情況,在同一個作用域中同一個巨集使用兩次會出現重定義錯誤。

#define SWAP(a,b)\
	int tmp = a; \
	a = b; \
	b = tmp;
int main()
{
	int x = 10;
	int y = 5;
	SWAP(x, y);
	SWAP(x, y);//此處會出錯
	system("pause");
	return 0;
}

在C++中,以inline修飾的函式叫做行內函數,編譯時C++編譯器會呼叫行內函數的地方展開,沒有函式壓棧開銷,行內函數提升程式執行的效率。

1)行內函數是以空間換時間的做法,省去呼叫函式的額外開銷。所以程式碼很長或者有迴圈/遞迴的函式不適宜使用內聯。
2)inline對編譯器而言只是一個建議,如果定義的函式體內有遞迴/迴圈等,編譯器優化時會自動忽略掉內聯。
3)Inline必須與函式定義放在一起,才能成為行內函數,僅將內聯放在宣告前是不起作用的。
4)一般情況下,行內函數只會用在函式內容非常簡單的情況,如果行內函數程式碼過多會造成可讀性差等問題。

class A
{
public:
	/*inline*/ void fun();//放在這裡不起作用
	
private:
	int a;
};
inline void A::fun()
{
	cout << "inline void A::fun()" << endl;
}

定義在類內的成員函式預設定義為行內函數。可以使用所在類的保護成員和私有成員。

class A
{
public:
	void fun()
{
//預設為內聯
}	
private:
	int a;
};

1)為什麼inline能夠很好的取代預定義?

1.Inline定義的行內函數,函式的程式碼在 使用時直接被替換,沒有呼叫開銷,提升了效率。

2.類的行內函數也是函式,編譯器在呼叫時會檢查它的引數,消除隱患

3.定義在類內的成員函式預設定義為行內函數。可以使用所在類的保護成員和私有成員。