零散的东西
unlikely(x)
内核中有很多if(unlikely(x)),这表示什么含义呢,看unlikely(x)的定义:
# define likely(x) __builtin_expect(!!(x), 1)
# define unlikely(x) __builtin_expect(!!(x), 0)
显然还有和unlikely对应的likely,这里!!(x)
是用来得到一个整型表达式的逻辑的1或者0。
__builtin_expect
是GCC內建的一个函数,用来进行分支预测,原型:
long __builtin_expect (long exp, long c)
第一个参数exp为整型的表达式,第二个参数c必须是编译期的常量(compile-time constant),这个內建函数的意思就是exp的预期值为c,编译器根据这个信息可以重新排列条件语句块的顺序,将符合这个条件的分支放在合适的位置。经过unlikely(x)
包装,实际上就是告诉编译器条件x发生的可能性不大,把这个分支的代码块放在比较远的位置,保证经常执行的代码在一起,likely(x)
则相反。