likely()unlikely()是内核中定义的两个函数宏,具体定义如下所示:

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

其中的__builtin_expect是gcc中提供的一个预处理命令(这个名词也是网上写的,我想叫函数更好些),==有利于代码优化==,它在gcc(version 4.4.0)具体定义如下:

long __builtin_expect (long exp, long c) [Built-in Function]

注解为:

You may use __builtin_expect to provide the compiler with branch prediction information. In general, you should prefer to use actual profile feedback for this (‘-fprofile-arcs’), as programmers are notoriously bad at predicting how their programs actually perform. However, there are applications in which this data is hard to collect.The return value is the value of exp, which should be an integral expression. The semantics of the built-in are that it is expected that exp == c.

大体意思为: 我们可以使用这个函数人为告诉编绎器一些分支预测信息“exp == c” 是“很可能发生的”,也就意味着告诉编译器可先进行判断“exp == c”是否真的发生了,==这样先判断大概率事件,便可省去一些步骤去判断一些小概率事件的发生。==

同时对于

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

也就是说明x == 1这种情况是“经常发生的”或是“很可能发生的”。

例:(内核版本2.6.22.6):/kernel/shed.c中有一段:

使用likely后 ,执行if后面语句的可能性大些,==编译器将if{}里的内容编译到前面。==

使用unlikely后,执行else后面语句的可能性大些,==编译器将else{}里的内容编译到前面。==

这样便有利于cpu预取,提高预取指令的正确率,因而可提高效率。

if (likely(!active_balance))
{/* We were unbalanced, so reset the balancing interval */sd->balance_interval = sd->min_interval;
}
else
{/** If we've begun active balancing, start to back off. This* case may not be covered by the all_pinned logic if there* is only 1 task on the busy runqueue (because we don't call* move_tasks).*/if (sd->balance_interval max_interval)sd->balance_interval *= 2;
}

编译过程中,会将if后面{}里的内容编译到前面,else 后面{}里的内容编译到后面。若将likely换成unlikely则正好相反。

==总之,likely与unlikely互换或不用都不会影响程序的正确性。但可能会影响程序的效率。==

注:同时对于__builtin_expect(!!(x), 1)中的!!(x),有说法是说为转换为BOOL型,但C中对BOOL型的支持貌似不太严格,所以此处好像意义不大。

==这两个函数宏的功能就是通过先进行一些大概率事件的判断与处理,并将该部分处理内容编译到前面,同时将对小概率事件的判断与处理放至后面,并将该部分处理内容编译到后面。==

==这样相应的在CPU中便可以省去一些的操作指令,以此来提升CPU的效率,属于一种效率优化手段。==

likely、unlikely相关推荐

  1. 专利审查指南(2010)

    专利审查指南(2010) http://www.chinalaw.gov.cn/article/fgkd/xfg/gwybmgz/201004/20100400253035.shtml来源国务院法制办 ...

  2. 湖南省中职学业水平测试试题信息技术

    试题: 1.按照指法要求,击打空格键,应使用( ). A.左手和右手的食指,因食指最灵活 B.左手或右手的拇指 C.左手或右手的中指 D.左手或右手的无名指 2.显示器的清晰度是由( )决定的. A. ...

  3. Photoshop入门与进阶实例:1.4 图层的概念和基本操作

    1.认识图层 图层功能被誉为Photoshop的灵魂,这个比喻一点也不夸张!图层在我们使用Photoshop进行图像处理中,具有十分重要的地位,也是最常用到的功能之一.掌握图层的概念是我们学习Phot ...

  4. 2023年你最值得了解的信息技术-AI篇(二)

    20688 北京朗阁信息技术有限公司 企业服务  前沿技术 北京市 mailkey 专注云企业邮件领域的产品,随云服务而生. 未融资 MailKey 是北京朗阁信息技术有限公司(以下简称"朗 ...

  5. 程序主动进行电话短信报警,自定义电话、短信、钉钉报警通知

    程序主动进行电话短信报警,自定义电话.短信.钉钉报警通知 一. 规则说明 这里我们要利用到阿里云的云监控的手段,有一个叫做事件监控的东西,可以通过自定义事件上传来进行监控报警. 流程: 程序发现错误 ...

  6. nginx配置http、https访问,nginx指定ssl证书,阿里云腾讯云华为云设置nginx https安全访问

    nginx配置http.https访问 要设置https访问需要从对应的云厂商申请证书,并下载Nginx证书到服务器. 我这里从阿里云申请了免费的域名证书,然后将证书放置在服务器的/etc/ssl/. ...

  7. 在Chrome中打开网页时出现以下问题 您的连接不是私密连接 攻击者可能会试图从 x.x.x.x 窃取您的信息(例如:密码、通讯内容或信用卡信息)

    现象:在Chrome中打开网页时出现以下问题 您的连接不是私密连接 攻击者可能会试图从 x.x.x.x 窃取您的信息(例如:密码.通讯内容或信用卡信息). 当点开"了解详情"后显示 ...

  8. 使用第三方SDK(如微信、qq、快看、头条等),调用接口405 Method Not Allowed

    使用第三方SDK(如微信.qq.快看.头条等),调用接口405 Method Not Allowed 错误描述:postman请求正常,但客户端调用后接口没有反应,但返回了405错误. 解决方法:第三 ...

  9. OpenAPI使用(swagger3),Kotlin使用swagger3,Java使用swagger3,gradle、Maven使用swagger3

    OpenAPI使用(swagger3) demo见Gitte 一.背景及名词解释 OpenAPI是规范的正式名称.规范的开发工作于2015年启动,当时SmartBear(负责Swagger工具开发的公 ...

  10. Alibaba Cloud Linux 2.1903 LTS 64位服务器yum源下载404,Alibaba Cloud Linux 2实例中使用docker-ce、epel等YUM源安装软件失败

    [Alibaba Cloud Linux 2.1903 LTS 64位]服务器yum源下载404 failure: repodata/repomd.xml from docker-ce-stable: ...

最新文章

  1. 百度15篇论文被AAAI 2019收录
  2. StratifiedShuffleSplit 交叉验证
  3. golang学习之旅:使用go语言操作mysql数据库(自己测试了)
  4. c语言中结束本次循环的语句是什么
  5. 从Pycharm说起
  6. php而且,PHP – David's Blog
  7. 数据分析、关键词和地下产业
  8. [译]A Simple CSS Animation Tutorial
  9. 总线全称_一篇文章讲透I2C总线协议
  10. 济南python工资一般多少-济南Go全栈区块链课程
  11. win10 mfc 连接mysql_win10下使用c语言连接mysql
  12. python json格式转换后,中文乱码
  13. GO ——奇妙的数组
  14. 如何用两个栈实现一个队列
  15. Centos 7 制作Oracle 12c Docker Images
  16. 第八周、第九周学习总结
  17. 计算机视觉基础知识复习
  18. Springboot 基于CXF构建WebService服务
  19. 一个能够屏蔽百度广告的爬虫:BaiduSpider
  20. linux进程命令面试,面试常问的 25+ 个 Linux 命令

热门文章

  1. lnmp一键安装包重新安装mysql
  2. 【临床预测模型】----诊断模型or 预后模型
  3. 【每日一练】118—一款评论留言加载动画效果
  4. 全球及中国汽车座椅加热行业现状分析及前景发展规划研究报告2021年版
  5. jetson nano 散热风扇控制
  6. WEB前端攻城小师傅修炼之道
  7. Xamarin.Android set cornerRadius by code
  8. 如何高性能的给UIImageView加个圆角?(不准说layer.cornerRadius!)
  9. 醉鹅舜达餐饮才是总部
  10. WarGame系列之Natas(Web安全)通关指北(初级篇0-10)详细版