C++關(guān)鍵字之likely和unlikely詳解_第1頁
C++關(guān)鍵字之likely和unlikely詳解_第2頁
C++關(guān)鍵字之likely和unlikely詳解_第3頁
C++關(guān)鍵字之likely和unlikely詳解_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論