1. 程式人生 > >淺談likely與unlikely

淺談likely與unlikely

在linux核心程式碼中隨處可見if語句中出現likely或unlikely,這兩個東西是幹什麼的呢?

偶然看到有人問這個問題,自己也整理一下~

likely或unlikely用於優化條件語句,其一般用法為:

條件判斷之後會有兩個出口,一個是真,一個是假。然而編譯生成的目的碼是扁平的,其中一個出口必須通過跳轉來實現

考慮下面一個場景:

1、判斷條件;

2、條件為真跳轉到4;

3、進行條件為假時的處理;

4、進行條件為真時的處理;

可見,如果條件為真,多了一次JMP操作,並且由於JMP打斷了處理器流水。

likely(x) 和 unlikely(x)的作用是用來編譯的讓程式碼在多數情況下不會發生JMP的情況

比如,likely(x)就告訴編譯器,x在大多數情況下結果會是真,於是編譯器生成的結果為真的出口不需要JMP。unlikely(x)類似~

突然又想到一個問題,其實likely和unlikely應該只對單條件的if語句才有意義。如果是多個條件的複合,條件表示式值的計算本身就要通過JMP來選擇真假出口,所以用不用likely都影響不大。