关于gcc的内建

以前看过likely和unlikely,知道大概表示意思,意思就是likely分支运行的机会可能性很大,知道这个概念之后,没有去研究。今天被别人问起,builtin,不清楚是怎么回事情。

 

今天再分析一下:

在include/linux/compiler.h
    编译之后的,也就是我们linux系统内的,注意不是download的.定义如下:
    #define likely(x)       __builtin_expect(!!(x), 1)
    #define unlikely(x)     __builtin_expect(!!(x), 0)

    也许你已经明白__builtin告诉你__builtin_expect是gcc内建的了,

由于大部分程序员在分支预测方面做得很糟糕,所以GCC提供了这个内建函数来帮助程序员处理分支预测,优化程序。其第一个参数exp为一个整型表
达式,这个内建函数的返回值也是这个exp,而c为一个编译期常量,这个函数的语义是:你期望exp表达式的值等于常量c,从而GCC为你优化程序,将符
合这个条件的分支放在合适的地方。
因为这个程序只提供了整型表达式,所以如果你要优化其他类型的表达式,可以采用指针的形式。
  likely(x) 其实就是期望x的值为1
   if(unlikely(x)){
           foo();
      }
来测试条件的话,我们就期望foo()函数执行,所以该宏的名字用likely也就是可能来表示。
  unlikely(x)望表达式x的值为0,从而如果我们用
   if(unlikely(x)){
           bar();
      }
来测试条件的话,我们就不期望bar()函数执行,所以该宏的名字用unlikely也就是不太可能来表示。
   上面这两条语句都是x为1的时候执行。其实也就一句话:if() 语句你照用, 跟以前一样, 只是 如果你觉得if()是1 的可能性非常大的时候, 就在表达式的外面加一个likely() , 如果可能性非常小(比如几率非常小),就用unlikely() 包裹上。 你也可以完全不用likely(),unlikely()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值