前段时间在阅读kernel的时候搞不懂为什么要用likely和unlikely,直接一个比较就搞定了。今天查到了likely和unlikely的宏定义
//位置为:include/linux/compile.h
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
|
在定义中需要用到两个!!的原因,应该是为了保证比较的是bool值0或者1
当x! = 0时,(x) == 1不能恒成立
当x! = 0时,!!(x) == 1恒成立
找了一圈,也没找到__builtin_expect()的定义,倒是在gcc的网站上找到这样的一段描述
You may use __builtin_expect to provide the compiler with branch prediction information. In general, you should prefer to use actual profile feedback for this (-fprofile-arcs), as programmers are notoriously bad at predicting how their programs actually perform. However, there are applications in which this data is hard to collect.
大概意思就是说你可以使用__builtin_expect提供编译器与分支预测信息。在通常情况下,您应该更喜欢使用实际的形式反应这个(-fprofile-arcs) ,作为程序员是众所周知难以预测他们的如何程序执行。但是,也有应用在这数据是很难收集。
所以也只能大概的分析下,接下来或许会去看看__builtin_expect的详细代码
阅读(1759) | 评论(0) | 转发(0) |