简单解释作用:
优化,提高性能。
给编译器的提示,指出分支预测中更可能跳转的分支。如果预测正确则几乎零开销,反之刷新处理器管道可能会花费几个周期。只要这个预测足够准确,就能有效提高性能。
long __builtin_expect(long EXP, long C);
这个宏告诉编译器编译器表达式EXP更有可能具有值C。
likely和unlikely对此进行包装,其中!!(x)是为了将x转化为一个标准的布尔值。
# define likely(x) __builtin_expect(!!(x), 1)
# define unlikely(x) __builtin_expect(!!(x), 0)
image.png
加入代码B经常被跳过,那么cache中B的内容很少被用到。所以对块重新排序,使经常执行的代码在内存中是线性的,而很少执行的代码则被移动到不会损害预取和 L1i 效率的地方。
参考资料:
How do the likely/unlikely macros in the Linux kernel work and what is their benefit?
《每个程序员都应该了解内存》