将流水线引入cpu,可以提高cpu的效率。更简单的说,让cpu可以预先取出下一条指令,减少cpu等待取指令的耗时,从而可以提供cpu的效率。

如果存在跳转指令,那么预先取出的指令就无用了。cpu在执行当前指令时,从内存中取出了当前指令的下一条指令。执行完当前指令后,cpu发现不是要执行下一条指令,而是执行offset偏移处的指令。cpu只能重新从内存中取出offset偏移处的指令。因此,跳转指令会降低流水线的效率,也就是降低cpu的效率。

综上,在写程序时应该尽量避免跳转语句。那么如何避免跳转语句呢?答案就是使用__builtin_expect。

这个指令是gcc引入的,作用是"允许程序员将最有可能执行的分支告诉编译器"。这个指令的写法为:__builtin_expect(EXP, N)。意思是:EXP==N的概率很大。

一般的使用方法是将__builtin_expect指令封装为LIKELY和UNLIKELY宏。这两个宏的写法如下。

        #define LIKELY(x) __builtin_expect(!!(x), 1) //x很可能为真#define UNLIKELY(x) __builtin_expect(!!(x), 0) //x很可能为假

综上而言,__builtin_expect是为了生成高效的代码

__builtin_expect的作用相关推荐

  1. 性能优化 - likely和unlikely函数

    简介 likely与unlikely是内核中定义的两个宏,位于/include/linux/compiler.h中,具体定义如下: #define likely(x) __builtin_expect ...

  2. __builtin_expect作用

    __builtin_expect作用 文章目录 __builtin_expect作用 引言 cyberRT中对__builtin_expect的封装 __builtin_expect作用 引言 最近在 ...

  3. __builtin_expect详解

    在GTK+2.0源码中有很多这样的宏:G_LIKELY和G_UNLIKELY.比如下面这段代码: if (G_LIKELY (acat == 1)) /* allocate through magaz ...

  4. __builtin_expect提高运行效率

    这个指令是gcc引入的,作用是"允许程序员将最有可能执行的分支告诉编译器".这个指令的写法为:__builtin_expect(EXP, N).意思是:EXP==N的概率很大. 给 ...

  5. unlikely 与 likely的作用

    unlikely与likely在linux kernel中经常出现. 函数定义: # define likely(x) __builtin_expect(!!(x), 1) # define unli ...

  6. 分支预测优化之__builtin_expect

    1.引言 在很多源码如Linux内核.Glib等,我们都能看到likely()和unlikely()这两个宏,通常这两个宏定义是下面这样的形式. #define likely(x) __builtin ...

  7. __builtin_expect用法

    __builtin_expect说明 GCC提供了一系列builtin函数,下面对__builtin_expect(EXP, N)函数进行说明. __builtin_expect(EXP, N)说明 ...

  8. 《C语言杂记》编译优化之__builtin_expect

    最近在研究压缩算法的时候,看到了以下代码: #define LIKELY(c) (__builtin_expect(!!(c), 1)) #define UNLIKELY(c) (__builtin_ ...

  9. likely(x)与unlikely(x)函数,即__builtin_expect的使用

    目录 1.引言 2. 函数声明 2.1. 功能描述 2.2. 参数详解 ① exp  ② c 2.3. 返回值 2.4. 使用方法 3. RATIONALE(原理) 4. likely()和unlik ...

最新文章

  1. 小程序客服消息推送自动回复_如何让小程序客服消息根据用户输入关键词自动回复图片?...
  2. snmp Oid整理与运用
  3. Open NI for Kinect安装测试
  4. 【opencv】边缘高斯模糊(canny+dilate+GaussianBlur)Python实现
  5. [密码学] 消息认证码构造方法
  6. 【Qt】QWidget类详解(函数篇)
  7. php 单例模式 单态模式
  8. Redis如何做内存优化?
  9. zookeeper在hadoop的应用
  10. php设置ip,php curl如何设置ip
  11. 编译ffmpeg:no match insn: lbu $r16,0($r5)
  12. 一三五、服务器部署Node项目、Vue spa静态项目、ssr项目
  13. 转录组-蛋白组-代谢组关联分析
  14. 活体检测-用照片来做人脸识别可行吗?
  15. 【学习笔记】AGC009/AGC019/AGC029/AGC035
  16. 文献调研神器——Connected Papers
  17. word文档图片画红线_在Word中巧妙绘制漂亮分割线的方法
  18. Python音乐跳舞毯(基于海龟画图创作的作品,来自Python创意编程100例sprites篇_Python精灵模块)
  19. as ssd测试软件得分少,教大家AS SSD Benchmark如何测试硬盘性能
  20. 古人诚不欺我-南怀瑾大师

热门文章

  1. vue移动端微信授权登录插件封装
  2. [转]为什么数学难学?
  3. 戴耳机导致中耳炎?这些不良的用耳习惯你还在用吗?
  4. 技术解读:腾讯优图12篇论文入选 ICCV 2017
  5. mysql配置MHA集群
  6. python中模块fitz无法导入成功的原因找到了
  7. 分布式计算框架Map/reduce
  8. 计算机常识--Linux篇
  9. Eigen库矩阵的求逆函数无法在CUDA代码使用
  10. 苹果新专利曝光,用户可通过Apple Watch及MR头显摄像头设置3D虚拟化身