作者:大明白
連結:
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 這條指令了。這樣系統在運作時就會減少重新取指了。