總之,likely與unlikely互換或不用都不會影響程式的正確性。但可能會影響程式的效率。
if(likely(foo)) //認為foo通常為1
if(unlikely(foo)) //認為foo通常為0
感謝各位光顧!
不知道有沒有寫清楚,望指正!
疑惑:為什麼likely或是unlikely要定義成__builtin_expect(!!(x), 1),而不直接用__builtin_expect(x, 1)?" !!(x) "與" x "有什麼不同?
另外核心2.6.31.5中likely和unlikely還有一種定義:
# ifndef likely
# define likely(x) (__builtin_constant_p(x) ? !!(x) : __branch_check__(x, 1))
# endif
# ifndef unlikely
# define unlikely(x) (__builtin_constant_p(x) ? !!(x) : __branch_check__(x, 0))
# endif
詳解likely和unlikely函式
在linux核心中likely和unlikely函式有兩種 只能兩者選一 實現方式,它們的實現原理稍有不同,但作用是相同的,下面將結合linux 2.6.38.8版本的核心 來進行講解。1 對 builtin expect的封裝 它們的源 如下 cpp view plain copy linux 2...
使用likely和unlikely 優化程式效能
作用 likely unlikely是為編譯器提供對分支優化的提示,基本用於if else的分支優化場景。if else在彙編時會將else分支的命令生成跳轉語句 jmp 而跳轉會影響程式效能,所以如果大部分情況下都是else分支成立的話,程式每次都會執行跳轉,從而影響效率,使用likely和unl...
核心中的likely和unlikely巨集的使用
在核心 中經常會看到unlikely和likely的蹤影。他們實際上是定義在 linux compiler.h 中的兩個巨集。define likely x builtin expect x 1 define unlikely x builtin expect x 0 這裡的 built expec...