likely和unlikey函数源码分析
来源:互联网 发布:网络管理基础知识 编辑:程序博客网 时间:2024/05/23 12:50
likely和unlikey函数源码分析
看代码的时候常常遇到likely和unlikely这两个函数,大概知道是用来检测返回值的,但是也不知道是什么。今天实在不爽了,就去看源码了。
在内核代码树的 include/linux/compiler.h里
void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);#define likely_notrace(x)__builtin_expect(!!(x), 1)#define unlikely_notrace(x)__builtin_expect(!!(x), 0)#define __branch_check__(x, expect) ({\int ______r;\static struct ftrace_branch_data\__attribute__((__aligned__(4)))\__attribute__((section("_ftrace_annotated_branch"))) \______f = {\.func = __func__,\.file = __FILE__,\.line = __LINE__,\};\______r = likely_notrace(x);\ftrace_likely_update(&______f, ______r, expect); \______r;\})/* * Using __builtin_constant_p(x) to ignore cases where the return * value is always the same. This idea is taken from a similar patch * written by Daniel Walker. */# ifndef likely# define likely(x)(__builtin_constant_p(x) ? !!(x) : __branch_check__(x, 1))# endif# ifndef unlikely# define unlikely(x)(__builtin_constant_p(x) ? !!(x) : __branch_check__(x, 0))# endif
这样就把数据x,压缩到,0和1两个值了!
如果不是内置的常数,这里就要执行__branch_check__,而__branch_check__看起来很麻烦,我们只需要关注
______r = likely_notrace(x);这行代码就OK了,其他代码不会影响_____r的值,而____r则是作为__branch_check__的返回值。
于是,我们看likely_notrace.
#define likely_notrace(x)__builtin_expect(!!(x), 1)两次取反和1比较,如果是1返回1,否则是0.
unlikely同理,只是期望的返回值是0罢了
如果以后有发现再update...
0 0
- likely和unlikey函数源码分析
- likely() unlikey()
- 内核中的unlikey和likely宏的说明
- GCC——分支预测(likely和unlikey)
- 内核中的unlikey和likely宏的说明
- Likely和unlikely 分析
- likely和unlikely函数
- likely和unlikely函数
- 详解likely和unlikely函数
- 详解likely和unlikely函数
- 详解likely和unlikely函数
- 详解likely和unlikely函数
- Linux 内核源码中likely()和unlikely()
- Linux 内核源码中likely()和unlikely()
- kernel 源码中的 likely() 和 unlikely()
- linux内核中:likely和unlikely函数
- likely和unlikely函数的含义
- PsSetCreateProcessNotifyRoutine函数和源码分析
- IFrame根据内容自动适应高宽(同域)
- Mysql 建表用 MyISAM不用InnoDB(大数据高读取)
- 等待事件()
- jTT5 在vs2010下编译问题集
- hdu-oj 1877 又一版 A+B
- likely和unlikey函数源码分析
- 赛德克·巴莱
- 翻译www.djangobook.com之第二章:Django快速上手
- POJ-2263 Heavy Cargo
- (简单博弈,奇偶轮换性)Calendar Game
- 11181-Probability
- FTP的传输有两种方式:ASCII传输模式和二进制数据传输模式
- Ant自动编译打包android项目
- iReport 报表、子报表、主从报表、合计、实例解析