C++中inline函數詳解_C 語言

來源:互聯網
上載者:User

本文主要記錄了C++中的inline函數,也就是內嵌函式,主要記錄了以下幾個問題:

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

主要目的:用它代替C語言中運算式形式的宏定義來解決程式中函數調用的效率問題。

C語言中的宏定義:#define ExpressionName(var1,var2) (var1+var2)*(var1-var2)這種宏定義,它使用前置處理器實現,沒有了參數壓棧、代碼產生等一系列得到操作,因此效率很高。但缺點如下:

僅僅是做前置處理器符號表中的簡單替換,因此不能進行參數有效性的檢測,不能享受C++編譯器嚴格類型檢查的好處。
另外,它的傳回值也不能被強制轉換為可轉換的合適類型。
還有,C++引入了類及類的存取控制,這樣,如果一個操作或者說一個運算式涉及類的保護成員或者私人成員,這種宏定義就無法實現(因為無法將this指標放在合適的位置上)

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

inline定義類的內嵌函式,函數的代碼被放入符號表中,在使用時直接進行替換(像宏一樣展開)沒有了調用的開銷,效率也高了。
類的內嵌函式也是一個真正的函數。編譯器在調用一個內嵌函式的時候,首先進行一系列的檢測(參數的類型)
inline函數可以作為某個類的成員函數,這就可以在其中使用該類的保護成員和私人成員。

三、inline函數的使用場合

範例程式碼:

由上述範例程式碼可知:A類的2個成員函數都是inline函數,readTest()函數的定義在類內,所以自動轉化為inline函數,setTest()函數的定義在類外,所以必須加inline關鍵字。類的成員常定義成保護和私人的,外界不能直接存取這些成員,所以必須有成員介面函數來訪問。這些介面函數被定義成inline函數,會獲得比較好的效果。所以,inline函數常用於定義存取函數(代碼簡短),inline函數的效率比較高。

四、為什麼不把所有的函數定義成inline函數?

inline是以代碼的膨脹(複製)為待見的,僅僅省去了函數調用的開銷,從而提高了函數的執行效率。如果,執行函數體內代碼的時間相比於函數調用的開銷大,那麼效率的收穫會很少。另一方面,每一個inline函數的調用都要複製代碼,使程式的總代碼量增大,消耗更多的記憶體空間。
所以:

函數的代碼量比較大時,使用inline函數會使記憶體消耗代價較高。
函數體內出現迴圈,那麼執行函數的時間要比函數調用的開銷大。
另外,類的建構函式和解構函式容易讓人誤解成使用inline更有效。要當心建構函式和解構函式可能會隱藏一些行為,如“偷偷地執行基類或成員對象的建構函式和解構函式。”
一個好的編譯器會根據函數體,自動取消不適合的inline函數。(說明了,inline不應該出現在類的內部,及函數的聲明的部分)

五、inline函數與宏的區別?

inline是在 編譯 時展開的,而宏是在 先行編譯 時展開的。
在編譯時間,inline函數可以直接嵌套到目標代碼裡,而宏只是簡單地文本替換
inline函數可以完成類型和語句是否正確,而宏不具有這樣的功能。
inline函數是函數,而宏不是函數。
宏的定義時,小心參數的處理(一般把參數用括弧括起來),否則會引起二義性,而inline函數不用擔心二義性。

以上所述就是本文的全部內容了,希望大家能夠喜歡。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.