C++行內函數
阿新 • • 發佈:2019-02-16
對於經常要使用的程式碼段,為了方便使用會將其封裝成函式。然而在呼叫函式時會建立棧幀,增加了額外的開銷。為了節省開銷,在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.定義在類內的成員函式預設定義為行內函數。可以使用所在類的保護成員和私有成員。