unlikely和likely函数作用

在Linux内核代码中,unlikely和likely宏常用于条件判断语句,以指导编译器进行优化。这两个宏是__builtin_expect函数的包装,通过指定条件成立或不成立的概率,来影响编译器的分支预测。当预期条件不常发生(unlikely),编译器会尝试将else部分的代码放在更接近执行路径的地方,反之亦然。这样做可以减少CPU的分支预测错误,从而提高性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在linux内核中的判断语句里常见到unlikely和likely函数。
如:

if(unlikely(a)) // if(likely(a))
{
	...
}
else
{
...
}

两函数实质是__builtin_expect的的宏定义,原型如下:

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

__builtin_expect 是GCC的内置函数,用来对选择语句的判断条件进行优化,常用于一个判断条件经常成立(如likely)或经常不成立(如unlikely)的情况。
__builtin_expect的函数原型为long __builtin_expect (long exp, long c),返回值为完整表达式exp的值,它的作用是期望表达式exp的值等于c(注意,如果exp == c条件成立的机会占绝大多数,那么性能将会得到提升,否则性能反而会下降)。而likely和unlikely是__builtin_expect函数的参数c=1(true)和0(false)的情况。

因此:
if(unlikely(a))和if(likely(a))的执行等价于if(a)是 一样的,区别在于unlikely和likely函数的加入会优化编译,加likely的意思是value的值为true的可能性更大一些,编译时会将if里的代码编译到紧跟likely判断后面;而unlikely表示value的值为fale的可能性更大一些,编译时会将else下面的代码指令编译到紧跟unlikely判断之后。这样做目的可以提高CPU指令判断效率,减少指令跳转而降低性能
·

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值