C++之inline函式使用總結
阿新 • • 發佈:2019-01-27
一、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函式不用擔心二義性。