下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第C++關(guān)鍵字之likely和unlikely詳解目錄什么是likely和unlikelylikely/unlikely的原理likely/unlikely的適用條件C++20中的likely/unlikely
什么是likely和unlikely
既然程序是我們程序員所寫,在一些明確的場(chǎng)景下,我們應(yīng)該比CPU和編譯器更了解哪個(gè)分支條件更有可能被滿足。我們是否可將這一先驗(yàn)知識(shí)告知編譯器和CPU,提高分支預(yù)測(cè)的準(zhǔn)確率,從而減少CPU流水線分支預(yù)測(cè)錯(cuò)誤帶來的性能損失呢?答案是可以!它便是likely和unlikely。在Linux內(nèi)核代碼中,這兩個(gè)宏的應(yīng)用比比皆是。下面是他們的定義:
#definelikely(x)__builtin_expect(!!(x),1)
#defineunlikely(x)__builtin_expect(!!(x),0)
likely,用于修飾if/elseif分支,表示該分支的條件更有可能被滿足。而unlikely與之相反
以下為示例。unlikely修飾argc0分支,表示該分支不太可能被滿足。
#includecstdio
#definelikely(x)__builtin_expect(!!(x),1)
#defineunlikely(x)__builtin_expect(!!(x),0)
intmain(intargc,char*argv[])
if(unlikely(argc0)){
puts("Positive\n");
}else
puts("ZeroorNegative\n");
return0;
}
likely/unlikely的原理
接下來,我們從匯編指令分析likely/unlikely到底是如何起作用的
首先我們將上述代碼中的unlikely去掉,然后反匯編,作為對(duì)照組
匯編如下,我們看到,if分支中的指令被編譯器放置于分支跳轉(zhuǎn)指令jle相鄰的位置,即CPU流水線在遇到j(luò)le指令所代表的的岔路口時(shí),更傾向于走if分支
.LC0:
.string"Positive\n"
.LC1:
.string"ZeroorNegative\n"
main:
subrsp,8
testedi,edi
jle.L2;如果argc=0,跳轉(zhuǎn)到L2
movedi,OFFSETFLAT:.LC0;如果argc0,從這里執(zhí)行
callputs
xoreax,eax
addrsp,8
movedi,OFFSETFLAT:.LC1
callputs
jmp.L3
接著我們?cè)趇f分支中加上unlikely,反匯編如下。這里的情況正好與對(duì)照組相反,if分支下的指令被編譯器放置于遠(yuǎn)離跳轉(zhuǎn)指令jg的位置。這意味著CPU此時(shí)更傾向于走else分支。
.LC0:
.string"Positive\n"
.LC1:
.string"ZeroorNegative\n"
main:
subrsp,8
testedi,edi
jg.L6
movedi,OFFSETFLAT:.LC1
callputs
xoreax,eax
addrsp,8
movedi,OFFSETFLAT:.LC0
callputs
jmp.L3
因此,通過對(duì)分支條件使用likely和unlikely,我們可給編譯器一種暗示,即該分支條件被滿足的概率比較大或比較小。而編譯器利用這一信息優(yōu)化其機(jī)器指令,從而最大限度減少CPU分支預(yù)測(cè)失敗帶來的懲罰。
likely/unlikely的適用條件
CPU有自帶的分支預(yù)測(cè)器,在大多數(shù)場(chǎng)景下效果不錯(cuò)。因此在分支發(fā)生概率嚴(yán)重傾斜、追求極致性能的場(chǎng)景下,使用likely/unlikely才具有較大意義。
C++20中的likely/unlikely
C++20之前的,likely和unlikely只不過是一對(duì)自定義的宏。而C++20中正式將likely和unlikely確定為屬性關(guān)鍵字。
intfoo(in
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《GAT 760.5-2008公安信息化標(biāo)準(zhǔn)管理分類與代碼 第5部分:制定修訂方式代碼》專題研究報(bào)告深度
- 2026年深圳中考語文壓縮語段專項(xiàng)試卷(附答案可下載)
- 2026年深圳中考英語期末綜合測(cè)評(píng)試卷(附答案可下載)
- 山東省青島市市北區(qū)2026年九年級(jí)上學(xué)期期末考試物理試題附答案
- 禁毒相關(guān)題目及答案
- 2026年深圳中考數(shù)學(xué)圓的切線專項(xiàng)試卷(附答案可下載)
- 大學(xué)生信息技術(shù)培訓(xùn)課件
- 臨終患者的心理社會(huì)支持
- 第14課《紅燭》(教學(xué)設(shè)計(jì))高二語文+拓展模塊下冊(cè)(高教版2023年版)
- 產(chǎn)科圍手術(shù)期產(chǎn)后焦慮護(hù)理
- 湖北省2024-2025學(xué)年高一上學(xué)期期末聯(lián)考數(shù)學(xué)試卷 含解析
- 農(nóng)業(yè)銀行房貸合同范本
- 成體館加盟協(xié)議書范文范本集
- DB34T 4506-2023 通督調(diào)神針刺療法應(yīng)用指南
- 02-輸電線路各階段設(shè)計(jì)深度要求
- 《認(rèn)識(shí)時(shí)鐘》大班數(shù)學(xué)教案
- T-CI 178-2023 高大邊坡穩(wěn)定安全智能監(jiān)測(cè)預(yù)警技術(shù)規(guī)范
- THHPA 001-2024 盆底康復(fù)管理質(zhì)量評(píng)價(jià)指標(biāo)體系
- 傷口的美容縫合減少瘢痕的形成
- MSOP(測(cè)量標(biāo)準(zhǔn)作業(yè)規(guī)范)測(cè)量SOP
- 顱鼻眶溝通惡性腫瘤的治療及護(hù)理
評(píng)論
0/150
提交評(píng)論