C++深入分析內(nèi)聯(lián)函數(shù)的使用_第1頁
C++深入分析內(nèi)聯(lián)函數(shù)的使用_第2頁
C++深入分析內(nèi)聯(lián)函數(shù)的使用_第3頁
C++深入分析內(nèi)聯(lián)函數(shù)的使用_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

第C++深入分析內(nèi)聯(lián)函數(shù)的使用目錄一、常量與宏回顧二、內(nèi)聯(lián)函數(shù)三、內(nèi)聯(lián)函數(shù)使用注意事項四、小結(jié)

一、常量與宏回顧

C++中的const常量可以替代宏常數(shù)定義,如︰

但是C++中是否有解決方替代宏代碼片段呢?這里就要引入內(nèi)聯(lián)函數(shù)。

二、內(nèi)聯(lián)函數(shù)

C++中推薦使用內(nèi)聯(lián)函數(shù)替代宏代碼片段C++中使用inline關(guān)鍵字聲明內(nèi)聯(lián)函數(shù)

內(nèi)聯(lián)函數(shù)聲明時inline關(guān)鍵字必須和函數(shù)定義結(jié)合在一起,否則編譯器會直接忽略內(nèi)聯(lián)請求

C++編譯器可以將一個函數(shù)進行內(nèi)聯(lián)編譯被C++編譯器內(nèi)聯(lián)編譯的函數(shù)叫做內(nèi)聯(lián)函數(shù)C++編譯器直接將函數(shù)體插入函數(shù)調(diào)用的地方內(nèi)聯(lián)函數(shù)沒有普通函數(shù)調(diào)用時的額外開銷(壓棧,跳轉(zhuǎn),返回)

C++編譯器不一定滿足函數(shù)的內(nèi)聯(lián)請求

下面先看一段宏定義的代碼:

#includestdio.h

#defineFUNC(a,b)((a)(b)(a):(b))

inlineintfunc(inta,intb)

returnaba:b;

intmain(intargc,char*argv[])

inta=1;

intb=3;

intc=FUNC(++a,b);

printf("a=%d\n",a);

printf("b=%d\n",b);

printf("c=%d\n",c);

return0;

}

下面為輸出結(jié)果,c=FUNC(++a,b),等價于c=((++a)(b)(++a):(b)),先執(zhí)行(++a)(b),得到a=,2,b=3,由于++a比b小,所以輸出++a,這個時候a=3,所以c也等于3。

如果使用內(nèi)聯(lián)函數(shù),

#includestdio.h

#defineFUNC(a,b)((a)(b)(a):(b))

inlineintfunc(inta,intb)

returnaba:b;

intmain(intargc,char*argv[])

inta=1;

intb=3;

intc=func(++a,b);

printf("a=%d\n",a);

printf("b=%d\n",b);

printf("c=%d\n",c);

return0;

}

輸出結(jié)果如下:

下面在VS2012中看一下反匯編的代碼,看一看內(nèi)聯(lián)有沒有成功。可以看到func函數(shù)被調(diào)用,而不是直接擴展到被調(diào)用的地方,內(nèi)聯(lián)沒有成功。inline這個關(guān)鍵字僅僅是請求將函數(shù)內(nèi)聯(lián),但是不一定會成功。

為了讓編譯器允許對內(nèi)聯(lián)的請求,可以對編譯器進行一些配置,如下圖

配置好以后,在intc=func(++a,b);前面打個斷點,開始跑代碼,但是我跑的時候報錯了。

這個時候,進行下面配置,那個錯誤就解決了。

這個時候在進行反匯編,如下圖所示,可以看到調(diào)用函數(shù)的匯編代碼沒有了,表示內(nèi)聯(lián)成功了。

內(nèi)聯(lián)函數(shù)具有普通函數(shù)的特征(參數(shù)檢查,返回類型等)函數(shù)的內(nèi)聯(lián)請求可能被編譯器拒絕函數(shù)被內(nèi)聯(lián)編譯后,函數(shù)體直接擴展到調(diào)用的地方

宏代碼片段由預(yù)處理器處理,進行簡單的文本替換,沒有任何編譯過程,因此可能出現(xiàn)副作用。

現(xiàn)代C++編譯器能夠進行編譯優(yōu)化,一些函數(shù)即使沒有inline聲明,也可能被內(nèi)聯(lián)編譯

一些現(xiàn)代C++編譯器提供了擴展語法,能夠?qū)瘮?shù)進行強制內(nèi)聯(lián),如︰

g++:_attribute__((always_inline))屬性MSVC:_forceinline

三、內(nèi)聯(lián)函數(shù)使用注意事項

C++中inline內(nèi)聯(lián)編譯的限制:

不能存在任何形式的循環(huán)語句不能存在過多的條件判斷語句函數(shù)體不能過于龐大不能對函數(shù)進行取址操作不能對函數(shù)進行取址操作

四、小結(jié)

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論