下載本文檔
版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 路堤接頭施工方案(3篇)
- 2026年安陽市龍安區(qū)人社局招聘社區(qū)人社服務(wù)專員(原人社協(xié)管員)8人備考考試題庫及答案解析
- 飛機停車指揮培訓(xùn)課件教學(xué)
- 2026貴州貴陽市觀山湖區(qū)第二幼兒園第二分園招聘3人備考考試題庫及答案解析
- 2026年福建中閩海上風(fēng)電有限公司招聘3-5人備考考試題庫及答案解析
- 2026甘肅酒肅州區(qū)泉民健康復(fù)醫(yī)院招聘4人考試參考試題及答案解析
- 2026一季度湖南張家界市本級招募就業(yè)見習(xí)人員119人筆試模擬試題及答案解析
- 2026山東淄博文昌湖省級旅游度假區(qū)面向大學(xué)生退役士兵專項崗位公開招聘工作人員參考考試題庫及答案解析
- 2026云南昆明市呈貢區(qū)婦幼健康服務(wù)中心招聘1人參考考試題庫及答案解析
- 第十一課ieüeer第一課時
- 2025年12月廣西區(qū)一模語文2025-2026年度首屆廣西職教高考第一次模擬考試2026年廣西高等職業(yè)教育考試模擬測試語文含逐題答案解釋99
- 2026元旦主題班會:馬年猜猜樂猜成語 (共130題)【課件】
- 湖北省2024-2025學(xué)年高二上學(xué)期期末考試英語含答案
- 鐵路物資管理培訓(xùn)課件
- 2025年國家能源集團有限責(zé)任公司招聘筆試面試真題題庫(含答案)
- (人教A版)必修一高一數(shù)學(xué)上冊同步分層練習(xí)1.3 并集與交集第1課時(原卷版)
- 完整銀行貸款合同5篇
- 2025版地暖施工項目進度管理與結(jié)算合同
- 2025年事業(yè)單位公開招聘考試(D類)《職業(yè)能力傾向測驗》新版真題卷(附詳細解析)
- 2025年尾礦綜合利用技術(shù)突破與生態(tài)修復(fù)技術(shù)協(xié)同創(chuàng)新研究
- 評定與追溯管理制度
評論
0/150
提交評論