浅谈likely与unlikely

简介:

在linux内核代码中随处可见if语句中出现likely或unlikely,这两个东西是干什么的呢?

偶然看到有人问这个问题,自己也整理一下~

likely或unlikely用于优化条件语句,其一般用法为:


条件判断之后会有两个出口,一个是真,一个是假。然而编译生成的目标代码是扁平的,其中的一个出口必须通过跳转来实现。
考虑下面一个场景:
1、判断条件;
2、条件为真跳转到4;
3、进行条件为假时的处理;
4、进行条件为真时的处理;
可见,如果条件为真,多了一次JMP操作,并且由于JMP打断了处理器流水。

likely(x)和unlikely(x)的作用是用来指导编译的,让代码在大多数情况下不会发生JMP的情况。
比如,likely(x)就告诉编译器,x在大多数情况下的结果会是真,于是编译器生成的结果为真的出口不需要JMP。unlikely(x)类似~

突然又想到一个问题,其实likely和unlikely应该只对单条件的if语句才有意义的。如果是多个条件的复合,条件表达式值的计算本身就要通过JMP来选择真假出口,所以用不用likely都影响不大。


目录
相关文章
|
Java
Java中的卫语句
Java中的卫语句
347 0
|
弹性计算 Ubuntu Shell
为eRDMA注册超大内存
本文介绍如何在eRDMA环境下注册大量内存。
494 0
|
IDE Linux 程序员
技术经验解读:【转】IO空间,IO端口,MMIO
技术经验解读:【转】IO空间,IO端口,MMIO
996 0
|
11月前
|
存储 C语言
【C语言】“void” 如何在 C 语言中开创无限可能
`void`是C语言中的一个特殊关键字,具有多种用途。它可以表示没有返回值的函数、没有参数的函数参数列表、以及通用指针类型等。
682 5
|
存储 编译器 C语言
C语言:数组名作为类型、作为地址、对数组名取地址的区别
在C语言中,数组名可以作为类型、地址和取地址使用。数组名本身代表数组的首地址,作为地址时可以直接使用;作为类型时,用于声明指针或函数参数;取地址时,使用取地址符 (&),得到的是整个数组的地址,类型为指向该类型的指针。
1075 4
|
安全 网络安全 数据安全/隐私保护
`certifi`是一个Python包,它提供了一个包含Mozilla证书颁发机构(CA)Bundle的PEM文件。
`certifi`是一个Python包,它提供了一个包含Mozilla证书颁发机构(CA)Bundle的PEM文件。
|
Linux
百度搜索:蓝易云【深入解析Linux进程内存:VSS、RSS、PSS、USS及查看方式】
通过以上方法,你可以深入了解Linux进程的内存使用情况,包括VSS、RSS、PSS、USS等指标,帮助你进行性能优化和资源管理。
553 12
|
存储 缓存 网络协议
ARP欺骗与攻击原理
ARP欺骗与攻击原理
643 0
|
并行计算 安全 编译器
【C/C++ 编译相关 gcc】一次搞懂GCC编译选项:优化代码、调试程序必备!
【C/C++ 编译相关 gcc】一次搞懂GCC编译选项:优化代码、调试程序必备!
1287 0
下一篇
oss云网关配置