1. 程式人生 > >C++之inline函式使用總結

C++之inline函式使用總結

一、C++為什麼引入inline函式?

主要目的:用它代替C語言中表達式形式的巨集定義來解決程式中函式呼叫的效率問題。

C語言中的巨集定義,它使用前處理器實現,沒有了引數壓棧、程式碼生成等一系列得到操作,因此效率很高。

但缺點如下:

前處理器符號表中的簡單替換,不能進行引數有效性的檢測,不能享受C++編譯器嚴格型別檢查的好處。
另外,它的返回值也不能被強制轉換為可轉換的合適型別。

C++如果一個操作或者說一個表示式涉及類的保護成員或者私有成員,這種巨集定義就無法實現(因為無法將this指標放在合適的位置上)

二、為什麼inline能很好的取代表達式形式的預定義?

inline定義類的行內函數,函式的程式碼被放入符號表中,在使用時直接進行替換(像巨集一樣展開)沒有了呼叫的開銷,效率也高了

類的行內函數也是一個真正的函式。編譯器在呼叫一個行內函數的時候,首先進行一系列的檢測(引數的型別)

inline函式可以作為某個類的成員函式,這就可以在其中使用該類的保護成員和私有成員。

三、inline函式的使用場合

inline可以理解為2種,一種是顯示的inline,一種是隱式的inline,如果類裡面定義了函式,那麼也就隱式呼叫的inline,預設是隱式。

示例程式碼:

#include <iostream>
using namespace std;

Class B
{
private:
    int test;
public:
    int readTest(){return test;}
    void setTest(int value);
};

inline void B::setTest(int value)
{
    test = value;
}

int main()
{
    return 0;
}

readTest()函式的定義在類內,所以自動轉化為inline函式,也就是隱式的,setTest()函式的定義在類外,加inline關鍵字。類的成員常定義成保護和私有的,外界不能直接訪問這些成員,所以必須有成員介面函式來訪問。這些介面函式被定義成inline函式,會獲得比較好的效果。所以,inline函式常用於定義存取函式(程式碼簡短),inline函式的效率比較高。

四、inline函式缺點

inline僅僅省去了函式呼叫的開銷,從而提高了函式的執行效率。如果,執行函式體內程式碼的時間相比於函式呼叫的開銷大,那麼效率的收穫會很少。另一方面,每一個inline函式的呼叫都要複製程式碼,使程式的總程式碼量增大,消耗更多的記憶體空間
函式的程式碼量比較大時,使用inline函式會使記憶體消耗代價較高。
函式體內出現迴圈,那麼執行函式的時間要比函式呼叫的開銷大。

另外,類的建構函式和解構函式容易讓人誤解成使用inline更有效。要當心建構函式和解構函式可能會隱藏一些行為,如“偷偷地執行基類或成員物件的建構函式和解構函式。”
一個好的編譯器會根據函式體,自動取消不適合的inline函式。(inline不應該出現在類的內部,及函式的宣告的部分

五、inline函式與巨集的區別?

inline是在 編譯 時展開的,而巨集是在 預編譯 時展開的。
在編譯時,inline函式可以直接巢狀到目的碼裡,而巨集只是簡單地文字替換
inline函式可以完成型別和語句是否正確,而巨集不具有這樣的功能。
inline函式是函式,而巨集不是函式。
巨集的定義時,小心引數的處理(一般把引數用括號括起來),否則會引起二義性,而inline函式不用擔心二義性。