在2.6内核中,随处可见likely()与unlikely(),下面就来分析一下他们的区别。首先要明确一点:
if(likely(value))等价于if(value);if(unlikely(value))也等价于if(value),也就是说从阅读和理解代码的角度来看,likely()与unlikely()是一样的。
在2.6.28内核中,这两个宏的定义如下:
#define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x)
__builtin_expect(!!(x), 0)
例如上篇日志中的 IS_ERR_VALUE宏定义:
#define IS_ERR_VALUE(x) unlikely((x) >= (unsigned
long)-MAX_ERRNO)
可以这样理解,x >= (unsigned long)-MAX_ERRNO
的可能性要小,也就是说x为错误指针的可能性要小,这也完全符合实际情况,因为内核函数返回指针出错的概率要比正确的概率小。
本文详细解析了2.6内核中likely()与unlikely()宏的作用及区别,阐述了如何利用这些宏指导编译器优化代码路径,减少指令跳转带来的性能损耗。
523

被折叠的 条评论
为什么被折叠?



