天天看點

轉載:__builtin_expect 說明

作者:大明白

連結:

https://www.jianshu.com/p/2684613a300f 來源:簡書

這個指令是gcc引入的,作用是允許程式員将最有可能執行的分支告訴編譯器。這個指令的寫法為:__builtin_expect(EXP, N)。

意思是:EXP==N的機率很大。

一般的使用方法是将__builtin_expect指令封裝為likely和unlikely宏。這兩個宏的寫法如下.

#define likely(x) __builtin_expect(!!(x), 1) //x很可能為真       
#define unlikely(x) __builtin_expect(!!(x), 0) //x很可能為假           

核心中的 likely() 與 unlikely()

首先要明确:

if(likely(value))  //等價于 if(value)
if(unlikely(value))  //也等價于 if(value)           

__builtin_expect() 是 GCC (version >= 2.96)提供給程式員使用的,目的是将“分支轉移”的資訊提供給編譯器,這樣編譯器可以對代碼進行優化,以減少指令跳轉帶來的性能下降。

__builtin_expect((x),1)表示 x 的值為真的可能性更大;

__builtin_expect((x),0)表示 x 的值為假的可能性更大。

也就是說,使用likely(),執行 if 後面的語句的機會更大,使用 unlikely(),執行 else 後面的語句的機會更大。通過這種方式,編譯器在編譯過程中,會将可能性更大的代碼緊跟着起面的代碼,進而減少指令跳轉帶來的性能上的下降。

例子

int x, y;
 if(unlikely(x > 0))
    y = 1; 
else 
    y = -1;           

上面的代碼中 gcc 編譯的指令會預先讀取 y = -1 這條指令,這适合 x 的值大于 0 的機率比較小的情況。如果 x 的值在大部分情況下是大于 0 的,就應該用 likely(x > 0),這樣編譯出的指令是預先讀取 y = 1 這條指令了。這樣系統在運作時就會減少重新取指了。

繼續閱讀