C++中inline函數(shù)詳解
本文主要記錄了C++中的inline函數(shù),也就是內(nèi)聯(lián)函數(shù),主要記錄了以下幾個問題:
一、C++為什么引入inline函數(shù)?
主要目的:用它代替C語言中表達式形式的宏定義來解決程序中函數(shù)調(diào)用的效率問題。
C語言中的宏定義:#define ExpressionName(var1,var2) (var1+var2)*(var1-var2)這種宏定義,它使用預(yù)處理器實現(xiàn),沒有了參數(shù)壓棧、代碼生成等一系列得到操作,因此效率很高。但缺點如下:
僅僅是做預(yù)處理器符號表中的簡單替換,因此不能進行參數(shù)有效性的檢測,不能享受C++編譯器嚴格類型檢查的好處。
另外,它的返回值也不能被強制轉(zhuǎn)換為可轉(zhuǎn)換的合適類型。
還有,C++引入了類及類的訪問控制,這樣,如果一個操作或者說一個表達式涉及類的保護成員或者私有成員,這種宏定義就無法實現(xiàn)(因為無法將this指針放在合適的位置上)
二、為什么inline能很好的取代表達式形式的預(yù)定義?
inline定義類的內(nèi)聯(lián)函數(shù),函數(shù)的代碼被放入符號表中,在使用時直接進行替換(像宏一樣展開)沒有了調(diào)用的開銷,效率也高了。
類的內(nèi)聯(lián)函數(shù)也是一個真正的函數(shù)。編譯器在調(diào)用一個內(nèi)聯(lián)函數(shù)的時候,首先進行一系列的檢測(參數(shù)的類型)
inline函數(shù)可以作為某個類的成員函數(shù),這就可以在其中使用該類的保護成員和私有成員。
三、inline函數(shù)的使用場合
示例代碼:
由上述示例代碼可知:A類的2個成員函數(shù)都是inline函數(shù),readTest()函數(shù)的定義在類內(nèi),所以自動轉(zhuǎn)化為inline函數(shù),setTest()函數(shù)的定義在類外,所以必須加inline關(guān)鍵字。類的成員常定義成保護和私有的,外界不能直接訪問這些成員,所以必須有成員接口函數(shù)來訪問。這些接口函數(shù)被定義成inline函數(shù),會獲得比較好的效果。所以,inline函數(shù)常用于定義存取函數(shù)(代碼簡短),inline函數(shù)的效率比較高。
四、為什么不把所有的函數(shù)定義成inline函數(shù)?
inline是以代碼的膨脹(復(fù)制)為待見的,僅僅省去了函數(shù)調(diào)用的開銷,從而提高了函數(shù)的執(zhí)行效率。如果,執(zhí)行函數(shù)體內(nèi)代碼的時間相比于函數(shù)調(diào)用的開銷大,那么效率的收獲會很少。另一方面,每一個inline函數(shù)的調(diào)用都要復(fù)制代碼,使程序的總代碼量增大,消耗更多的內(nèi)存空間。
所以:
函數(shù)的代碼量比較大時,使用inline函數(shù)會使內(nèi)存消耗代價較高。
函數(shù)體內(nèi)出現(xiàn)循環(huán),那么執(zhí)行函數(shù)的時間要比函數(shù)調(diào)用的開銷大。
另外,類的構(gòu)造函數(shù)和析構(gòu)函數(shù)容易讓人誤解成使用inline更有效。要當心構(gòu)造函數(shù)和析構(gòu)函數(shù)可能會隱藏一些行為,如“偷偷地執(zhí)行基類或成員對象的構(gòu)造函數(shù)和析構(gòu)函數(shù)?!?br />
一個好的編譯器會根據(jù)函數(shù)體,自動取消不適合的inline函數(shù)。(說明了,inline不應(yīng)該出現(xiàn)在類的內(nèi)部,及函數(shù)的聲明的部分)
五、inline函數(shù)與宏的區(qū)別?
inline是在 編譯 時展開的,而宏是在 預(yù)編譯 時展開的。
在編譯時,inline函數(shù)可以直接嵌套到目標代碼里,而宏只是簡單地文本替換
inline函數(shù)可以完成類型和語句是否正確,而宏不具有這樣的功能。
inline函數(shù)是函數(shù),而宏不是函數(shù)。
宏的定義時,小心參數(shù)的處理(一般把參數(shù)用括號括起來),否則會引起二義性,而inline函數(shù)不用擔心二義性。
以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。
相關(guān)文章
C++中的std::initializer_list使用解讀
這篇文章主要介紹了C++中的std::initializer_list使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07Linux下C語言的fork()子進程函數(shù)用法及相關(guān)問題解析
fork()函數(shù)在Linux下可以用于產(chǎn)生一個子進程,這里我們挑選了兩個fork相關(guān)的面試題,來看一下Linux下C語言的fork()子進程函數(shù)用法及相關(guān)問題解析2016-06-06