likely()和unlikely()

CPU流水线:

CPU的工作也可以大致分为指令的获取、解码、运算和结果的写入四个步骤,
如果不采用流水线工作方式,依次进行工作,后面的部件等待前面的部件工作的完成,
当一部分工作的时候,其余的三部分会空闲,这是对资源的极大的浪费
直接影响到CPU的工作效率

define likely(x) __builtin_expect(!!(x), 1)

define unlikely(x) __builtin_expect(!!(x), 0)

likely(x)宏传入__builtin_expect(!!(x), 0)的第一个参数为!!x,这样写是因为__builtin_expect的第一个参数需要为long型,而我们如果想传入指针或字符串类型,则需要使用!!x将x变成long型,例如,如果一个指针ptr==NULL,则!ptr=1,而!!ptr=0。

这个函数无论在linux内核还是在一些系统开发中经常看到,实际上是用来做分支预测的,分支预测的意义如下:

CPU的流水线的工作模式,决定在执行一条指令时顺便会把接下来要执行的指令读取

当执行到if这样的分支的时候,决定是取if下面的指令,还是其他分支的指令

我们取出被执行可能性最大的那个分支的指令序列,这样就可以提升执行的效率;
反之,如果预测不准确,那么提前被读取的指令就没有意义,需要重新读取其他分支的指令。

类似于这样的代码:

if( likely(expr) )
{
	//将这部分代码编译到前面,利于CPU取指
}
else
{
}
一般认为表达式expr在绝大多数情况下是成立的

if(unlikely(expr))
{
}
else
{
	//将这部分代码编译到前面,利于CPU取指
}
一般认为表达式expr在绝大多数情况下是不成立的

#define likely(x) __builtin_expect(!!(x), 1)也就是说明x==1是“经常发生的”或是“很可能发生的”。
使用likely ,执行if后面语句的可能性大些,编译器将if{}中的内容编译到前面,

使用unlikely ,执行else后面语句的可能性大些,编译器将else{}里的内容编译到前面。这样有利于cpu预取,提高预取指令的正确率,因而可提高效率。

总结:
likely与unlikely互换或不用都不会影响程序的正确性,但可能会影响程序的效率。
参考链接:
https://blog.csdn.net/jasonchen_gbd/article/details/44968395
https://blog.csdn.net/tommy_wxie/article/details/7384641

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C语言中,UNLIKELY是一个宏定义,用于提示编译器某个条件的发生概率较低。它一般用于if语句中,让编译器优化代码以提高性能。UNLIKELY可以与条件表达式结合使用,以告诉编译器这个条件很少会满足,从而优化代码的执行路径。通常,UNLIKELY用于if语句中的条件表达式,使得编译器更倾向于执行if语句中的else分支,以提高代码的执行效率。!!运算符是C语言中处理逻辑表达式的一个技巧,用于将非零值转换为1。当变量x为非零值时,!!(x)返回1,当x为零时,!!(x)返回0。这个技巧常用于将条件表达式的结果映射为布尔值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [C语言技巧:有if时使用likelyunlikely让代码运行更快](https://blog.csdn.net/freestep96/article/details/128771498)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [C语言进阶——likelyunlikely](https://blog.csdn.net/weixin_44873133/article/details/107302688)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值