if (unlikely(error)) return error; 经过学习后,知道调用likely()或unlikely()告诉编译器这个条件很有可能或者不太有可能发生,好让编译器对这个条件判断进行正确地优化。这两个宏的定义如下: # define likely(x) __builtin_expect(!!(x), 1) # define unlikely(x) __builtin_expect(!!(x), 0) 从宏...
因为likelyexp代表条件表达式exp很可能成立而unlikelyexp代表条件表达式exp很可能不成立当程序员清楚exp表达式多数情况成立不成立时就可使用likelyunlikely使if分支else分支紧跟跳转指令其后从而在大多数情况下不用执行跳转指令避开跳转指令所带来的开销从而达到优化的目的...
也就是说,使用 likely(),执行 if 后面的语句的机会更大,使用 unlikely(),执行 else 后面的语句机会更大一些。 通过这种方式,编译器在编译过程中,会将可能性更大的代码紧跟着后面的代码,从而减少指令跳转带来的性能上的下降。 这样cache 在预取数据时可以尽量取到真正要跑的数据,增加了 cache 的命中率。 不用...
1) #define unlikely(x) __builtin_expect(!!(x), 0) int test_likely(int x) { if(likely(x)) x = 5; else x = 6; return x; } int test_unlikely(int x) { if(unlikely(x)) x = 5; else x = 6; return x; }
1 在linux kernel源码里经常可以看到likely与unlikely这两个关键字的使用,查了下源码,原来这两个关键字是两个宏,在kernel源码的include/linux/compiler.h文件中有如下定义(linux-3.11.0-rc1):2 由于CONFIG_PROFILE_ALL_BRANCHES没有定义,故而两个宏对应的定义如下:3 # define likely(x) __builtin_expect...
Linux内核中的宏定义likely()与unlikely() 在Linux kernel的源代码中,经常能见到if(likely(x))或if(unlikely(x))之类的用法,其确切含义需要说明一下,以便更好的理解kernel的源代码。 likely与unlikely这两个宏在linux/compiler.h中的定义如下: (x) __builtin_expect(!!(x),1)...
linux-kernel之likely和unlikely 在阅读linux源代码的时候,我们经常会发现likely和unlikely,这两个宏语句定义在compiler.h下, #define likely(x)__builtin_expect(!!(x), 1) #define unlikely(x)__builtin_expect(!!(x), 0) 这里我们需要先了解__builtin_expect:# define __builtin_expect(x, expected_...
(http://blog.csdn.net/ce123) GCC GCC version::arm-linux-gcc-3.4.1 看内核时经常遇到if(likely()){}或是if(unlikely())这样的语句,不甚了解,例如(选自kernel/fork.c 中copy_process): SET_LINKS(p); if(unlikely(p->ptrace&PT_PTRACED)) __ptrace_link(p,current->parent); 下面详细分析一下...
likely和unlikely宏 把分支预测的信息提供给编译器,以降低因为指令跳转带来的分支下降: #define likely(x) __builtin_exp ect(!!(x), 1) #define unlikely(x) __builtin_exp ect(!!(x), 0) GCC的内建方法会判断 EXP == C 是否成立,成立则将if分支中的执行语句紧跟放在汇编跳转指令之后,否则将else分...
if (likely(value))等价于if (value) if (unlikely(value))等价于if (value) 也就是说likely()和unlikely()从阅读和理解的角度是一样的。 这两个宏在内核中定义如下: #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) ...