Linux内核中的likely()和unlikely()宏

在Linux内核代码中经常看到likely()和unlikely()这两个宏,它们都是对bool变量进行判定,其定义如下:

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

其中__builtin_expect()函数是gcc提供的用于对分支语句进行优化,其原型如下:

long __builtin_expect (long exp, long c)

当exp == c时,该函数返回非零值;

gcc内建这个函数用于条件选择语句的优化,在一个条件经常出现,或者该条件很少出现的时候,编译器可以对条件分支选择进行优化;likely(x)即表示x很可能或者绝大多数情况下为真;而unlikely则刚好相反。(宏定义中的!!(x),对x两次取反,只是确保将x转化成bool型

如对下面的条件选择语句:

if (error) {
    ......
}

如果想把这个标记成绝少发生的分支,即认为error绝大多数情况下都为0:

if (unlikely(error)) {
    ......
}

相反,如果认为某个分支发生的可能性很大:

if (likely(success)) {
    ......
}

即认为success在绝大多数情况下为真。

上述说那么多都是废话!!!细节,又比不上https://cosysn.github.io/2017/01/14/introduction-to-linux-kernel-2-likey-and-unlieky/

对于likely(x)和unlikely(x)到底返回什么值,简单得很,一句话:

likely(x)和unlikely(x)都是说“x是真的?”,x如果是true,则两者均返回true;否则为false。

likely和unlikely本身并不会改变x的逻辑,它只是用于编译优化,所以,后面再碰到likely和unlikely,直接把它们去掉,只看后面的表达式就行了。

unlikely(0)返回false,unlikely(1)返回true;

likely(1)返回true;likely(2)返回true;likely(0)返回false。
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值