您的位置:首页网页设计经验技巧 → likely和unlikely宏定义

likely和unlikely宏定义

时间:2009/12/21 9:28:00来源:本站整理作者:我要评论(0)

 在内核代码中经常会看到unlikely和likely的踪影。他们实际上是定义在 linux/compiler.h 中的两个宏。

  #define likely(x)    __builtin_expect(!!(x), 1)

  #define unlikely(x)  __builtin_expect(!!(x), 0)

  这里的__built_expect()函数是gcc的內建函数。

  至于为什么要在内核代码中使用这两个宏,主要的目的是为了进行代码的优化,提高系统执行速度。

  比如 :

  if (likely(a>b)) {

  fun1();

  }

  if (unlikely(a<b)) {

  fun2();

  }

  这里就是程序员可以确定 a>b 在程序执行过程中出现的可能相比较大,因此使用了likely()告诉编译器将fun1()函数的二进制代码紧跟在前面程序的后面,这样就cache在预取数据时就可以将fun1()函数的二进制代码拿到cache中。这样,也就增加了cache的命中率。

  同样的,unlikely()的作用就是告诉编译器,a<b 的可能性很小所以这里在编译时,将fun2()的二进制代码尽量不要和前边的编译在一块。

  我们不用对likely和unlikely感到迷惑,需要知道的就是 if(likely(a>b)) 和 if(a>b)在功能上是等价的,同样 if(unlikely(a<b)) 和 if(a<b) 的功能也是一样的。不一样的只是他们声称的二进制代码有所不同,这一点我们也可以从他们的汇编代码中看到。

  比如下面的代码:

  #include <stdio.h>

  #define unlikely(x) __builtin_expect(!!(x), 0)

  #define likely(x) __builtin_expect(!!(x), 1)

  int main()

  {

  int a=2,b=4;

  if(unlikely(a<b)) {

  printf("in the unlikely,is not your expecting!\n");

  } else {

  printf("in the unlikely, is your expecting\n");

  }

  if(likely(a<b)) {

  printf("in the likely, is your expecting\n");

  }

  return 0;

  }

  执行结果:

  in the unlikely,is not your expecting!

  in the likely, is your expecting

  总之,likely和unlikely的功能就是增加cache的命中率,提高系统执行速度。

相关视频

    没有数据

相关阅读 listary使用教程 listary的使用技巧dnfhello特权专区活动地址 dnfhello特权专区黑钻礼包领取地址dnfhello语音打团开黑领福利活动地址 dnfhello语音黑钻礼包领取地ELDEN RING什么时候出 ELDEN RING发售时间一览macOS 10.15支持哪些设备升级 macOS Catalina可升级设备一览macOS 10.15有什么新功能 macOS Catalina新功能详细介绍LOL我们是冠军宝箱活动地址 loliG冠军皮肤宝箱网址剑士kenshi巨人瑞怎么招募 剑士kenshi巨人瑞招募方法

文章评论
发表评论

热门文章 Wordpress本地安装教程dx1.5如何设置二级域名

最新文章 hbuilder有哪些快捷键Wordpress本地安装教程 Wordpress本地安装教程expression web 4文档乱码解决方法dz 2.5“收藏本版”关闭小对话框无法关闭解在制作安装软件之前,您必须先将易语言存盘,

人气排行 如何使用multipart/form-data格式上传文件Photoshop PS图层混合模式详解(非常详细)ISAPI_Rewrite3使用教程网站里添加收藏和设为首页代码桌面快捷方式图标不见了C#获取执行程序所在的当前路径的方法详解(XMLHttpRequest)进行跨域请求方法如何用远程桌面连接进行传输文件