linux中 likely与unlikely,见了不少次,但终究没体验过所谓的提高效率,所以,如果不是阅读他人的讲解,自己在码砖的时候就不能想到使用它,软实力的一个体现吧。
看内核时总遇到if(likely( )){}或是if(unlikely( ))这样的语句,具体定义如下:
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
#define likely(x) __builtin_expect(!!(x), 1)也就是说明x==1是“经常发生的”或是“很可能发生的”。
使用likely ,执行if后面语句的可能性大些,编译器将if{}是的内容编译到前面, 使用unlikely ,执行else后面语句的可能性大些,编译器将else{}里的内容编译到前面。这样有利于cpu预取,提高预取指令的正确率,因而可提高效率。
总之,likely与unlikely互换或不用都不会影响程序的正确性。但可能会影响程序的效率。
if(likely(foo)) //认为foo通常为1
if(unlikely(foo)) //认为foo通常为0
!!(x)这个操作会把 x 转化成bool值,即0或1.
Linux内核中likely与unlikely的宏定义解析:http://www.linuxdiyf.com/linux/12900.html
linux内核中的likely和unlikely宏定义:http://www.linuxdiyf.com/linux/604.html