/*************************************************************************
* Linux likely unlikely
* 说明:
* 在阅读一些源代码的时候经常会遇到likely和unlikely,一直也没有去进一步
* 跟踪其工作机制,于是今天抽点时间来验证一下。
*
* 2016-5-3 深圳 南山平山村 曾剑锋
************************************************************************/
一、参考文档:
. Linux中的likely()和unlikely()
http://blog.chinaunix.net/uid-25409479-id-158584.html
. 浅析linux likely unlikely的实现细节
http://www.bianceng.cn/OS/Linux/201605/49902.htm
二、Demo:
#include <stdio.h>
#define unlikely(expr) __builtin_expect (expr, 0)
#define likely(expr) __builtin_expect (expr, 1)
int main(int argc, char *argv) {
printf("unlikely: %02x.\n", unlikely(!=));
printf("unlikely: %02x.\n", unlikely(==));
printf("likely: %02x.\n", likely(!=));
printf("likely: %02x.\n", likely(==));
}
三、结果:
myzr@myzr:~/c_program$ ./a.out
unlikely: .
unlikely: .
likely: .
likely: .
四、结论:
. 在expr中,表达的值并不会影响likely、unlikely表达式的返回值,故其使用方法应该是相同的;
. 如参考文章中提到的:使用likely(),执行if后面的语句的机会更大,使用unlikely(),执行else后面的语句机会更大一些。
. 于是我们知道了,likely、unlikely不影响表达式的值,而是表示执行if、else中代码可能性加上了推测的可能性。