likely unlikely

1. 代码:

在很多源码如Linux内核,我们都能看到likely()和unlikely()这两个宏。

通常这两个宏定义是下面这样的形式。

	#define LIKELY(x) __builtin_expect(!!(x),1) 
			//表示 x 的值为真的可能性更大
			//如: if(likely(1))
			
	#define UNLIKELY(x) __builtin_expect(!!(x),0) 
			//表示 x 的值为假的可能性更大。
			//如: if(unlikely(!0))

可以看出这2个宏都是使用函数 __builtin_expect()实现的, __builtin_expect()函数是GCC的一个内建函数(build-in function).

2. 解释:

如果能事先判断一个if语句时经常为真还是经常为假,那么可以用unlikely和likely来优化这段判断的代码。
如:
if(1){……} 这样这里就可以使用 if(likely(1))
if(0){……} 这样这里就可以使用 if(unlikely(!0))

if(likely(something)) 	//等价于 if(something) 等于 if(1)
				      	//表示 something 为真  情况经常发生likely
				      	
if(unlikely(!something))   //等价于 if(!something) 等于 if(!0)
						   //表示 !something 为真 情况很少发生 可以忽略掉 unlikely

3. 原因:

由于大部分程序员在分支预测方面做得很糟糕,
所以GCC 提供了这个内建函数来帮助程序员处理分支预测.

参考:

https://www.cnblogs.com/LubinLew/p/GCC-__builtin_expect.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值