# Qestion about linux kernel macro "unlikely" ## liklely 我在 lab0 中研讀 `list_sort()` 時學習到 `likely` 巨集使 copmpiler 優化程式碼, 可以有效增加 branch hit 的次數。 likely 的定義在 [include/linux/compiler.h](https://github.com/torvalds/linux/blob/master/include/linux/compiler.h) 中, 其實作如下 (若沒有開啟 branch profiling): ```c #define likely(x) __builtin_expect(!!(x), 1) ``` `__builtin_expect` 為 gcc built-in function, 其在 `x` 前加兩個 `!` 得原因為若想判斷 x 為非 0 整數, 透過 `!! (x)` 可以確保出來的值是 1, 而達到判斷非 0 整數的目的。 較詳細的探討請參考我的 [lab0 共筆](https://hackmd.io/qOQ_qSevT0ubeh2Ci9QfOw?view#likely) 的 `likely` 部分。 ## 問題 我的問題是, `likely` 的相反例子的實作, `unlikely` 巨集的定義如下: ```c #define unlikely(x) __builtin_expect(!!(x), 0) ``` 若 `x` 為 `0`, 則應該不需要 `!!(x)` 來確保出來的值是 `0`, 只需傳入 `x` 即可, 我想知道這麼做是否另有目的。