likely && unlikely

蓝牙Mesh安全机制全解析:如何防止你的智能门锁被黑客控制? 本文深入解析蓝牙Mesh安全机制,重点探讨如何保护智能门锁免受黑客攻击。详细介绍了蓝牙Mesh的多层次安全架构,包括密钥管理体系、设备入网流程及实战防护策略,帮助用户构建更安全的智能家居网络。 阅读详情

likely和unlikely是gcc扩展的跟处理器相关的宏:

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


现在处理器都是流水线的,有些里面有多个逻辑运算单元,系统可以提前取多条指令进行并行处理,但遇到跳转时,则需要重新取指令,这相对于不用重新去指令就降低了速度。所以就引入了likely和unlikely,目的是增加条件分支预测的准确性,cpu会提前装载后面的指令,遇到条件转移指令时会提前预测并装载某个分支的指令。unlikely 表示你可以确认该条件是极少发生的,相反likely表示该条件多数情况下会发生。编译器会产生相应的代码来优化cpu执行效率。
因此程序员在编写代码时可以根据判断条件发生的概率来优化处理器的取指操作。

 从表面上看if(likely(value)) == if(value),if(unlikely(value)) == if(value)

 内核2.2.26的头文件include/linux/compiler.h中有宏定义

/*
 * Generic compiler-dependent macros required for kernel
 * build go below this comment. Actual compiler/compiler version
 * specific implementations come from the above header files
 */

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


 __builtin_expect是gcc的一个预处理命令,其解释如下:

long __builtin_expect (long exp, long c)
You may use __builtin_expect to provide the compiler with branch prediction information. In general, you should prefer to use actual profile feedback for this (‘-fprofile-arcs’), as programmers are notoriously bad at predicting how their programs actually perform. However, there are applications in which this data is hard to collect.
The return value is the value of exp, which should be an integral expression. The value of c must be a compile-time constant. The semantics of the built-in are that it is  expected that exp == c.

家用智能监控摄像机如何使用NAS进行存储/备份(小米智能摄像机如何解决群晖 / 飞牛 NAS 识别失败、文件目录不显示问题) 小米摄像头NAS存储总出问题?🤯 别慌!本文揭秘NAS底层逻辑,群晖、飞牛实战指南。手把手教你排查解决所有难题,轻松搞定监控录像安全备份!🔒 阅读详情

相关推荐

“开宝五子棋陪练”-首款开放智能的五子棋习题练习安卓应用

使用Kotlin语言以及Jetpack Compose UI库开发,主要就是写Composable函数,显示棋盘、棋子和一些按钮,响应用户的点击和滑动操作,以及保存和恢复数据。但我针对本应用是用于做题的特殊需求,对该算法库做了一个简单的JNI层封装,方便UI前端Kotlin代码的调用。

weixin_44120030的博客 2396

linux中 likely与unlikely

照抄别人的日志.. 看内核时总遇到if(likely( )){}或是if(unlikely( ))这样的语句,最初不解其意,现在有所了解,所以也想介绍一下。likely() 与 unlikely()是内核(我看的是2.6.22.6版本,2.6的版本应该都有)中定义的两个宏。位于/include/linux/compiler.h中,具体定义如下:#define likely(x) __bui

1736

从IMC层到应力点:手把手教你用SEM/EDS给BGA焊点做一次‘体检’

本文详细介绍了如何使用SEM/EDS技术对BGA焊点进行全面失效分析,从样品制备到SEM观察、EDS分析,再到综合诊断,手把手教你识别焊点的微观特征和成分异常。文章特别强调了IMC层分析在BGA焊接失效诊断中的关键作用,并提供了实用的实验室技巧和常见失效模式对照表,帮助工程师快速定位问题根源。

weixin_42685438的博客 379

linux宏定义likely和unlikely解析

解析内核宏定义:likely、unlikely

雨天不打滑的博客 1222

DANN实战:用Python手把手教你实现对抗迁移学习(附完整代码)

本文通过Python实战教程,手把手教你实现DANN对抗迁移学习模型,以解决领域偏移问题。文章详细解析了领域对抗神经网络的核心机制,包括梯度反转层和领域判别器的构建,并提供了从数据准备、模型搭建到训练评估的完整代码,帮助开发者快速掌握这一强大的无监督领域自适应技术。

net55的博客 317

Zemax非序列模式微透镜阵列仿真:从建模到优化完整指南

光线追迹是光学系统仿真的核心技术,其原理基于几何光学与物理光学的光线传播模型,通过精确计算光线在光学元件中的折射、反射与散射路径,实现对系统性能的预测与评估。在微透镜阵列等复杂多通道光学系统中,传统序列模式因光线路径受限而难以准确模拟串扰与杂散光,非序列光线追迹技术则凭借其灵活的空间传播机制成为关键手段。该技术广泛应用于激光整形、光束匀化、3D传感及光场成像等领域,能够有效支持阵列结构设计与优化。Zemax非序列模式为微透镜阵列仿真提供了完整的建模、优化与公差分析流程,是光学工程师进行复杂系统设计的核心工具

weixin_29967003的博客 324

【notes】一些编程方法

关于编程中一些容易被我忽略的编程方法及思想等,可以提高执行效率或者提高代码健硕性等等

过得精彩,无所谓好坏 708

数学与纳米技术:微观世界的数学描述

《数学与纳米技术:微观世界的数学描述》 关键词:纳米技术、数学模型、微观世界、物理现象、计算模拟 摘要:本文探讨了数学在纳米技术领域的应用,从数学基础回顾、纳米技术引论,到物理现象与

AI天才研究院 1531

Linux likely和unlikely的使用

一、源代码 #include <linux/init.h> #include <linux/module.h> static int __init hello_init(void) { int a = 10; int b = 6; printk(KERN_INFO "hello_init.\n"); if(l...

xiezhi123456的博客 570

【MicroPython编程-ESP32篇:设备驱动】-BNO08X系列传感器驱动

BNO08X 系列(BNO085/BNO086)是一款系统级封装 (SiP),集成了三轴加速度计、三轴陀螺仪、磁力计以及运行 CEVA SH-2 固件的 32 位 ARM® Cortex™-M0+ 微控制器。SH-2 包含 MotionEngine™ 软件,该软件提供复杂的信号处理算法来处理传感器数据,并提供精确的实时 3D 姿态、航向、校准加速度和校准角速度,以及更高级的上下文输出。BNO08X 集成在一个 28 引脚 LGA 封装中,尺寸为 3.8mm x 5.2mm x 1.1mm。它兼容 Andro

视觉与物联智能 691

R语言绘制森林图

运行上述代码后,将会生成一个标题为"森林图示例"的森林图。通过以上代码示例,你可以根据自己的数据集和需求创建定制的森林图。在实际应用中,你还可以进一步调整图形的样式,添加图例、坐标轴标签等,以使森林图更加美观和易于理解。在数据可视化领域,森林图是一种常用的图形类型,用于展示多个分类变量之间的关系。本文将介绍如何使用R语言创建森林图,并提供相应的源代码示例。森林图通常由垂直的线段表示不同类别的观测值,并且线段的长度表示数值变量的大小。上述代码中,我们为不同的类别分别指定了蓝色和红色作为颜色映射关系。

TechNovaX的博客 1045

likely && unlikely in GCC

在linux内核源码或一些比较成熟的c语言架构源码中,我们常会见到类似下面的代码: 1 if (unlikely(!packet)) { 2 return res_failed; 3 } 4 5 // OR 6 7 if (likely(packet->type = HTTP)) { 8 do_something(); 9 }有的地方可能会用大...

weixin_30421525的博客 100

钢结构焊接连接工艺

钢结构焊接连接工艺

wwdoffice950426的博客 61

likely() && unlikely() && __builtin_expect((x), 1)

在Linux2.6内核中,看到一对奇怪的函数,likely(), unlikely()。 追踪回去,发现其实是一对宏,如下实现: #define likely(x)  __builtin_expect((x), 1) #define unlikely(x)  __built

joker0910的专栏 6320

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

likely() && unlikely() && __builtin_expect((x), 1

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33755557的博客 106

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Linux likely、unlikely

​ 1、likely,unlikely同if else一样进行分支判断;likely 期望执行if (true)为真的分支;unlikely 期望执行 if (true) 当中的else分支, 直接运 行else分支代码。​ 2、likely, unlikely 通过分支预测指令的预取能提高代码的执行效率。

谨以此记录下自己的每一点、每一滴、每一步,以督促自己,不忘目标,不忘理想。 1651

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C++关键字之likely和unlikely

摘要:C++中的likely/unlikely用于优化分支预测性能。GCC/Clang通过__builtin_expect实现,C++20引入标准属性语法[[likely]]/[[unlikely]]。它们指导编译器优化代码布局,但对CPU预测影响有限。建议基于性能分析数据使用,适用于错误处理等场景。C++20标准属性语法更清晰,而__builtin_expect兼容性更好。注意避免滥用,仅在性能关键路径且有实测依据时使用。

聚焦前沿科技与硬核技术底层拆解,深耕 AI、量子计算、WebAssembly 等核心领域,拒绝碎片化科普。以通俗语言讲透复杂原理,用干货内容拆解技术逻辑,助力从业者吃透核心、把握趋势,每篇都是可落地的深度技术沉淀。 893

likely和unlikely

gcc编译器在编译生成汇编代码时会在编译选项的引导下调整if分支内代码的位置,如果是likely修饰过的就调整到前面,如果是unlikely修饰过的就调整到后面。放到前面的代码可以节省跳转指令带来的时间开销,从而达到提升效率的目的。当代CPU都有ICache和流水线机制,在运行当前这条指令时,ICache会预读取后面的指令,以提升运行效率。但是如果条件分支的结果是跳转到了其他指令,那预取的下一条指令(有的CPU设计是4级流水,也就是4条指令)就没用了,这样就降低了流水线的效率。

weixin_42149196的博客 1046

Android 本地代码中的LIKELY和UNLIKELY宏

<br />阅读Android Frameworks中的C++代码时,经常会碰到在条件判断语句中使用了LIKELY和UNLIKELY这两个宏,找到这两个宏的定义如下:<br />#define LIKELY( exp ) (__builtin_expect( (exp) != 0, true )) #define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false ))   <br /> <br />long __builtin

DroidPhone的专栏 6300

likely和unlikely宏

    首先,无论在何处,当我们遇到宏likely和宏unlikely时,都要明确一点:  if(likely(value)) 等价于 if(value)  if(unlikely(value)) 也等价于 if(value)    也就是说 ,当value值为真时执行if分支,为假时执行else分支,从阅读和理解代码的角度来看,是一样的!!!以下为这两个宏的一般定义:#define likely(x)       __builtin_expect(!!(x), 1)#define unlikely(x) 

David_Henry的专栏 3107

Linux 中的 likely 和 unlikely

likely()、unlikely() 原理是利用了GCC 的内建函数(),通过编译器预测代码分支;GCC 编译器会将不希望的代码分支放最后;GCC 可能优先执行期盼的执行,再进行判断,不同的编译器版本实现方式不同;likely() 表示该表达式为 “True” 的概率大一些,unlikely() 表示改表达式为 “True” 的概率小一些;likely()、unlikely() 通过分支预测指令的预取能提高代码的执行效率。

私房菜 1276

likely和unlikely的用法

在实际使用中,应该基于性能分析和测试结果来确定哪些分支更有可能和不太可能执行,并相应地使用这些宏。如果错误地使用这些宏,可能会导致性能下降,因此建议在优化代码之前进行充分的性能分析。它们通常与条件语句的分支一起使用,以指示哪些分支更有可能执行,哪些分支更不可能执行。在一般的应用程序中,使用这些宏的性能影响可能不明显,因此在普通应用程序中使用它们可能没有太大的必要。例如,在Linux内核中,通常会将likely用于可能出现的快速路径,而将unlikely用于可能出现的慢速路径,以帮助编译器更好地优化代码。

坛城的博客 1292

Likely和unlikely 分析

第一部分 问题描述 在阅读2.6内核代码时经常出现likely()和unlikely()两个宏函数,下面来解释一下这两个宏函数的函数含义。 例如在Linux 2.6.38内核include/linux/compiler.h中,这两个宏的定义如下: #define likely(x)    __builtin_expect(!!(x), 1) #define unli

GreatChance的专栏 812

likely unlikely

__builtin_expect1. 代码:2. 解释:3. 原因:参考: 1. 代码: 在很多源码如Linux内核,我们都能看到likely()和unlikely()这两个宏。 通常这两个宏定义是下面这样的形式。 #define LIKELY(x) __builtin_expect(!!(x),1) #define UNLIKELY(x) __builtin_expect(!!(x),0) ...

哈尼的博客 268

关于likely、unlikely、__builtin_expect的学习

likely、unlikely、__builtin_expect的关系 #define likely(x) __builtin_expect((x),1) #define unlikely(x) __builtin_expect((x),0)

u010411205的博客 486

unlikely和likely

主要是跟处理器有关,现在处理器都是流水线的,有些里面有多个逻辑运算单元,系统可以提前取多条指令进行并行处理,但遇到跳转时,则需要重新取指令,这相对于不用重新去指令就降低了速度。所以对unlikely的宏,系统运行时,将减少跳转,重新取指。 与assert()是不一样的,assert()是对一个值进行判断,如指针是否为NULL,如果为NULL,则程序直接exit。跟unlikely是不用级别上的东

随便写写 819
上一篇: container_of分析
下一篇: 模块参数与符号
IT_Linux
博客等级 码龄14年 31粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值