C++中inline函數(shù)詳解
本文主要記錄了C++中的inline函數(shù),也就是內(nèi)聯(lián)函數(shù),主要記錄了以下幾個(gè)問題:
一、C++為什么引入inline函數(shù)?
主要目的:用它代替C語言中表達(dá)式形式的宏定義來解決程序中函數(shù)調(diào)用的效率問題。
C語言中的宏定義:#define ExpressionName(var1,var2) (var1+var2)*(var1-var2)這種宏定義,它使用預(yù)處理器實(shí)現(xiàn),沒有了參數(shù)壓棧、代碼生成等一系列得到操作,因此效率很高。但缺點(diǎn)如下:
僅僅是做預(yù)處理器符號(hào)表中的簡(jiǎn)單替換,因此不能進(jìn)行參數(shù)有效性的檢測(cè),不能享受C++編譯器嚴(yán)格類型檢查的好處。
另外,它的返回值也不能被強(qiáng)制轉(zhuǎn)換為可轉(zhuǎn)換的合適類型。
還有,C++引入了類及類的訪問控制,這樣,如果一個(gè)操作或者說一個(gè)表達(dá)式涉及類的保護(hù)成員或者私有成員,這種宏定義就無法實(shí)現(xiàn)(因?yàn)闊o法將this指針放在合適的位置上)
二、為什么inline能很好的取代表達(dá)式形式的預(yù)定義?
inline定義類的內(nèi)聯(lián)函數(shù),函數(shù)的代碼被放入符號(hào)表中,在使用時(shí)直接進(jìn)行替換(像宏一樣展開)沒有了調(diào)用的開銷,效率也高了。
類的內(nèi)聯(lián)函數(shù)也是一個(gè)真正的函數(shù)。編譯器在調(diào)用一個(gè)內(nèi)聯(lián)函數(shù)的時(shí)候,首先進(jìn)行一系列的檢測(cè)(參數(shù)的類型)
inline函數(shù)可以作為某個(gè)類的成員函數(shù),這就可以在其中使用該類的保護(hù)成員和私有成員。
三、inline函數(shù)的使用場(chǎng)合
示例代碼:
由上述示例代碼可知:A類的2個(gè)成員函數(shù)都是inline函數(shù),readTest()函數(shù)的定義在類內(nèi),所以自動(dòng)轉(zhuǎn)化為inline函數(shù),setTest()函數(shù)的定義在類外,所以必須加inline關(guān)鍵字。類的成員常定義成保護(hù)和私有的,外界不能直接訪問這些成員,所以必須有成員接口函數(shù)來訪問。這些接口函數(shù)被定義成inline函數(shù),會(huì)獲得比較好的效果。所以,inline函數(shù)常用于定義存取函數(shù)(代碼簡(jiǎn)短),inline函數(shù)的效率比較高。
四、為什么不把所有的函數(shù)定義成inline函數(shù)?
inline是以代碼的膨脹(復(fù)制)為待見的,僅僅省去了函數(shù)調(diào)用的開銷,從而提高了函數(shù)的執(zhí)行效率。如果,執(zhí)行函數(shù)體內(nèi)代碼的時(shí)間相比于函數(shù)調(diào)用的開銷大,那么效率的收獲會(huì)很少。另一方面,每一個(gè)inline函數(shù)的調(diào)用都要復(fù)制代碼,使程序的總代碼量增大,消耗更多的內(nèi)存空間。
所以:
函數(shù)的代碼量比較大時(shí),使用inline函數(shù)會(huì)使內(nèi)存消耗代價(jià)較高。
函數(shù)體內(nèi)出現(xiàn)循環(huán),那么執(zhí)行函數(shù)的時(shí)間要比函數(shù)調(diào)用的開銷大。
另外,類的構(gòu)造函數(shù)和析構(gòu)函數(shù)容易讓人誤解成使用inline更有效。要當(dāng)心構(gòu)造函數(shù)和析構(gòu)函數(shù)可能會(huì)隱藏一些行為,如“偷偷地執(zhí)行基類或成員對(duì)象的構(gòu)造函數(shù)和析構(gòu)函數(shù)。”
一個(gè)好的編譯器會(huì)根據(jù)函數(shù)體,自動(dòng)取消不適合的inline函數(shù)。(說明了,inline不應(yīng)該出現(xiàn)在類的內(nèi)部,及函數(shù)的聲明的部分)
五、inline函數(shù)與宏的區(qū)別?
inline是在 編譯 時(shí)展開的,而宏是在 預(yù)編譯 時(shí)展開的。
在編譯時(shí),inline函數(shù)可以直接嵌套到目標(biāo)代碼里,而宏只是簡(jiǎn)單地文本替換
inline函數(shù)可以完成類型和語句是否正確,而宏不具有這樣的功能。
inline函數(shù)是函數(shù),而宏不是函數(shù)。
宏的定義時(shí),小心參數(shù)的處理(一般把參數(shù)用括號(hào)括起來),否則會(huì)引起二義性,而inline函數(shù)不用擔(dān)心二義性。
以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
上一篇:C語言實(shí)現(xiàn)字母大小寫轉(zhuǎn)換的方法
欄 目:C語言
下一篇:C語言實(shí)現(xiàn)的程序員老黃歷實(shí)例
本文標(biāo)題:C++中inline函數(shù)詳解
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/3002.html
您可能感興趣的文章
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)數(shù)怎么表達(dá)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10APUE筆記之:進(jìn)程環(huán)境詳解
- 01-10c++中inline的用法分析
- 01-10如何尋找數(shù)組中的第二大數(shù)


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10delphi制作wav文件的方法
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子