以前看过likely和unlikely,知道大概表示意思,意思就是likely分支运行的机会可能性很大,知道这个概念之后,没有去研究。今天被别人问起,builtin,不清楚是怎么回事情。
今天再分析一下:
在include/linux/compiler.h
编译之后的,也就是我们linux系统内的,注意不是download的.定义如下:
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
也许你已经明白__builtin告诉你__builtin_expect是gcc内建的了,
由于大部分程序员在分支预测方面做得很糟糕,所以GCC提供了这个内建函数来帮助程序员处理分支预测,优化程序。其第一个参数exp为一个整型表
达式,这个内建函数的返回值也是这个exp,而c为一个编译期常量,这个函数的语义是:你期望exp表达式的值等于常量c,从而GCC为你优化程序,将符
合这个条件的分支放在合适的地方。
因为这个程序只提供了整型表达式,所以如果你要优化其他类型的表达式,可以采用指针的形式。
likely(x) 其实就是期望x的值为1
if(unlikely(x)){
foo();
}
来测试条件的话,我们就期望foo()函数执行,所以该宏的名字用likely也就是可能来表示。
unlikely(x)望表达式x的值为0,从而如果我们用
if(unlikely(x)){
bar();
}
来测试条件的话,我们就不期望bar()函数执行,所以该宏的名字用unlikely也就是不太可能来表示。
上面这两条语句都是x为1的时候执行。其实也就一句话:if() 语句你照用, 跟以前一样, 只是 如果你觉得if()是1
的可能性非常大的时候, 就在表达式的外面加一个likely() , 如果可能性非常小(比如几率非常小),就用unlikely() 包裹上。
你也可以完全不用likely(),unlikely()