C++11中內(nèi)聯(lián)函數(shù)(inline)用法實(shí)例_第1頁
C++11中內(nèi)聯(lián)函數(shù)(inline)用法實(shí)例_第2頁
C++11中內(nèi)聯(lián)函數(shù)(inline)用法實(shí)例_第3頁
C++11中內(nèi)聯(lián)函數(shù)(inline)用法實(shí)例_第4頁
C++11中內(nèi)聯(lián)函數(shù)(inline)用法實(shí)例_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第C++11中內(nèi)聯(lián)函數(shù)(inline)用法實(shí)例目錄inline是什么?引入inline的目的是什么?內(nèi)聯(lián)函數(shù)的特點(diǎn)內(nèi)聯(lián)函數(shù)的寫法隱式內(nèi)聯(lián)和顯式內(nèi)聯(lián)inline函數(shù)的編譯器處理內(nèi)聯(lián)函數(shù)優(yōu)缺點(diǎn)虛函數(shù)可以是內(nèi)聯(lián)函數(shù)嗎?虛函數(shù)內(nèi)聯(lián)條件?虛函數(shù)表現(xiàn)多態(tài)性的時候不能內(nèi)聯(lián)總結(jié)

inline是什么?

inline是C++11引入的關(guān)鍵字,在函數(shù)聲明or定義時,返回類型前加上關(guān)鍵字inline,即可以把函數(shù)指定為內(nèi)聯(lián)函數(shù)。

引入inline的目的是什么?

目的是解決一些頻繁調(diào)用的函數(shù)大量消耗??臻g(棧內(nèi)存)的問題。另一方面用于替換C語言的宏(相比較宏是無法在進(jìn)行類型檢查)

內(nèi)聯(lián)函數(shù)的特點(diǎn)

內(nèi)聯(lián)函數(shù)的函數(shù)內(nèi)容本質(zhì)上是寫在調(diào)用內(nèi)聯(lián)函數(shù)的地方;內(nèi)聯(lián)函數(shù)本質(zhì)上沒有入棧出棧的開銷;和宏定義相比,內(nèi)聯(lián)函數(shù)更加安全,編譯器會根據(jù)函數(shù)的要求進(jìn)行嚴(yán)格的類型和作用域檢查,保證調(diào)用無誤;內(nèi)聯(lián)函數(shù)一般上不包含循環(huán)、遞歸、switch或較長的代碼等復(fù)雜操作;類聲明中定義的函數(shù),除虛函數(shù)外的其他函數(shù)都會自動隱式地當(dāng)成內(nèi)聯(lián)函數(shù);

內(nèi)聯(lián)函數(shù)的寫法

這里的一個關(guān)鍵點(diǎn),inline必須與函數(shù)定義放在一起才能使函數(shù)成為內(nèi)聯(lián)函數(shù),僅將inline放在函數(shù)聲明前面不起任何作用。

inline是一種用于實(shí)現(xiàn)的關(guān)鍵字,不是一種用于聲明的關(guān)鍵字。

//在頭文件中可以進(jìn)行顯示聲明

//方式1加inline(建議使用)

inlineintTestFunc(inta,intb);

//方式2原始常見聲明方式

intTestFunc(inta,intb);

//在源文件中定義

inlineintTestFunc(inta,intb){

//dosomething

return0;

intTestFunc(inta,intb){

//dosomething

return0;

隱式內(nèi)聯(lián)和顯式內(nèi)聯(lián)

隱式內(nèi)聯(lián)的寫法

classCppObj{

intTestFuncA(){return0;}//隱式內(nèi)聯(lián)

vitrualintTestFuncB(){return0;}//虛函數(shù)不會進(jìn)行隱式內(nèi)聯(lián)

顯式內(nèi)聯(lián)的寫法

classCppObj{

intTestFuncA();

inlineintTestFuncB();

vitrualintTestFuncC();

inlineintCppObj::TestFuncA(){//顯式內(nèi)聯(lián)

return0;

inlineintCppObj::TestFuncB(){//顯式內(nèi)聯(lián)

return0;

inline函數(shù)的編譯器處理

inline函數(shù)僅僅是一個開發(fā)者對編譯器的建議,至于最后能否真正內(nèi)聯(lián),需要看編譯器的意思。如果編譯器判定函數(shù)不復(fù)雜,能在調(diào)用點(diǎn)展開,就會真正內(nèi)聯(lián)。

內(nèi)聯(lián)函數(shù)優(yōu)缺點(diǎn)

優(yōu)點(diǎn)內(nèi)聯(lián)函數(shù)相比宏函數(shù)來說,在代碼調(diào)用時會做安全檢查和類型轉(zhuǎn)換(同普通函數(shù)),而宏定義則不會;宏定義不可以在運(yùn)行時可調(diào)試,但內(nèi)聯(lián)函數(shù)可以;內(nèi)聯(lián)函數(shù)同宏函數(shù)一樣會在被調(diào)用處進(jìn)行展開,無需參數(shù)壓棧、棧幀開辟與回收,結(jié)果返回等,從而能提高代碼的運(yùn)行速度。缺點(diǎn)代碼膨脹。內(nèi)聯(lián)是以代碼膨脹(復(fù)制)為代價,是典型的以空間換時間的做法。內(nèi)聯(lián)函數(shù)不可控。內(nèi)聯(lián)函數(shù)只是編碼者對編譯器的建議,是否對函數(shù)內(nèi)聯(lián),最終決定權(quán)在于編譯器。inline函數(shù)無法隨著函數(shù)庫升級而升級。inline函數(shù)的改變需要重新編譯,不像non-inline可以直接鏈接。

虛函數(shù)可以是內(nèi)聯(lián)函數(shù)嗎?

虛函數(shù)可以是內(nèi)聯(lián)函數(shù);inline是可以修飾虛函數(shù);

虛函數(shù)內(nèi)聯(lián)條件?

可以內(nèi)聯(lián)的條件,編譯器具有實(shí)際對象而不是對象的指針或引用時才會,所以當(dāng)虛函數(shù)表現(xiàn)多態(tài)性的時候不能內(nèi)聯(lián)。

虛函數(shù)表現(xiàn)多態(tài)性的時候不能內(nèi)聯(lián)

內(nèi)聯(lián)是在編譯期進(jìn)行的,但虛函數(shù)的多態(tài)性在運(yùn)行期,所以編譯器無法知曉運(yùn)行期具體調(diào)用哪個代碼

代碼釋義

#includeiostream

usingnamespacestd;

classBase{

public:

virtual~Base(){}

inlinevirtualvoidFuncName(){cout"thisisBase"endl;}

classDerived:publicBase{

public:

inlinevirtualvoidFuncName(){cout"thisisDerived"endl;}

intmain()

//編譯器具有實(shí)際對象,所以它可以是內(nèi)聯(lián)的.

Baseb;

b.FuncName();

//編譯器具有對象的指針,呈現(xiàn)多態(tài)性,運(yùn)行時期才能確定,所以不能內(nèi)聯(lián)。

Base*p=newDerived();

p-FuncName();

deletep;

p=nullptr;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論