当前位置: 首页 > news >正文

【ARM 嵌入式 编译系列 4.1 -- GCC 编译属性 likely与unlikely 学习】

文章目录

    • GCC likely与unlikely 介绍
      • linux 内核中的 likely/unlikely

上篇文章:ARM 嵌入式 编译系列 4 – GCC 编译属性 __read_mostly 介绍
下篇文章: ARM 嵌入式 编译系列 4.2 – GCC 链接规范 extern “C“ 介绍

GCC likely与unlikely 介绍

likelyunlikely 是GCC编译器提供的一种代码优化特性,这两个宏用于告诉编译器某个条件判断的结果是真还是假的可能性更大。

在编写代码时,如果我们已经知道某个条件判断的结果大部分情况下都是真或者假,就可以使用likelyunlikely宏来进行标记,编译器会根据这个提示进行优化,使得代码运行更高效。

以下是这两个宏的定义:

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

这里的__builtin_expectGCC的内建函数,用于提供编译器关于表达式结果的预期值。

以下是如何在代码中使用这两个宏的:

if (likely(x > 0)) {// 大部分情况下,x都大于0 
} else { // 一般情况下,这里的代码不会执行 
} if (unlikely(err != 0)) {// 一般情况下,err都等于0,所以这里的代码很少执行 
}

在这两个示例中,likelyunlikely宏标记了条件判断的结果预期,这样编译器在生成机器代码时,可以将更可能执行的代码放在内存中的靠前位置,从而提高代码执行效率。

linux 内核中的 likely/unlikely

这两个宏在内核中的定义如下:

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

可见这里使用了 gcc 的内建函数 __builtin_expect()

__builtin_expect (long exp, long c) 函数:
该函数用来引导 gcc 进行条件分支预测。在一条指令执行时,由于流水线的作用,CPU可以同时完成下一条指令的取指,这样可以提高CPU的利用率。在执行条件分支指令时,CPU也会预取下一条执行,但是如果条件分支的结果为跳转到了其他指令,那 CPU 预取的下一条指令就没用了,这样就降低了流水线的效率。
另外,跳转指令相对于顺序执行的指令会多消耗 CPU 时间,如果可以尽可能不执行跳转,也可以提高 CPU 性能。

使用 __builtin_expect (long exp, long c) 函数可以帮助 gcc 优化程序编译后的指令序列,使汇编指令尽可能的顺序执行,从而提高 CPU 预取指令的正确率和执行效率。

__builtin_expect(exp, c) 接受两个 long 型的参数,用来告诉 gcc:exp==c 的可能性比较大。
例如,__builtin_expect(exp, 1) 表示程序执行过程中,exp 取到 1 的可能性比较大。该函数的返回值为 exp 自身。

内核中 likely(x)unlikely(x)
知道 __builtin_expect() 函数的作用之后,我们就知道内核中 likely(x)unlikely(x) 宏的作用了,通过 likely(x)unlikely(x) 宏定义,我们可以得出他们的作用:

  • likely(x) 等价于 x,即 if (likely(x)) 等价于 if (x),但是它告诉 gcc,x 取 1 的可能性比较大;
  • unlikely(x) 等价于 x,即 if (unlikely(x))等 价于 if (x),但是它告诉 gcc,x 取 0 的可能性比较大。

上篇文章:ARM 嵌入式 编译系列 4 – GCC 编译属性 __read_mostly 介绍
下篇文章: ARM 嵌入式 编译系列 4.2 – GCC 链接规范 extern “C“ 介绍

相关文章:

【ARM 嵌入式 编译系列 4.1 -- GCC 编译属性 likely与unlikely 学习】

文章目录 GCC likely与unlikely 介绍linux 内核中的 likely/unlikely 上篇文章:ARM 嵌入式 编译系列 4 – GCC 编译属性 __read_mostly 介绍 下篇文章: ARM 嵌入式 编译系列 4.2 – GCC 链接规范 extern “C“ 介绍 GCC likely与unlikely 介绍 likely 和 unlikely …...

《算法竞赛·快冲300题》每日一题:“造电梯”

《算法竞赛快冲300题》将于2024年出版,是《算法竞赛》的辅助练习册。 所有题目放在自建的OJ New Online Judge。 用C/C、Java、Python三种语言给出代码,以中低档题为主,适合入门、进阶。 文章目录 题目描述题解C代码Java代码Python代码 “ 造…...

NSS [MoeCTF 2022]baby_file

NSS [MoeCTF 2022]baby_file 题目源码直接给了 使用data伪协议发现被ban了。 那就换一种伪协议php://filter,猜测flag在同目录下flag.php中或根目录下/flag中 php://filter/readconvert.base64-encode/resourceflag.php读取文件源码(针对php文件需要ba…...

喜报!诚恒科技与赛时达科技达成BI金蝶云星空项目合作

随着全球数字化浪潮轰轰烈烈袭来,仅仅凭借手工处理的方式难以在庞大的数据海洋中精准获取信息、把握市场需求、了解目标用户,为企业创新提供强有力的支持。深圳赛时达科技有限公司(简称赛时达科技)希望通过数字化转型实现从手工处…...

Vscode python调试和运行环境设置

Vscode python调试和运行环境设置 文章目录 Vscode python调试和运行环境设置前言一、是否为每次运行python程序都要选择环境烦恼二、是否为python程序调试不能进标准/第三方库而烦恼 前言 一、是否为每次运行python程序都要选择环境烦恼 在.vscode文件夹(没有就自己造一个)下…...

lua中执行luci.sys.call、luci.sys.exec、os.execute的区别

相同点:都是调用Linux底层脚本及程序 不同点: (1)luci.sys.call(command) 脾气捉摸不透,实际使用有些时候没有得到任何状态或数据返回,纯粹被用了一下。 (2)luci.sys.exec(command) …...

Python-OpenCV中的图像处理-模板匹配

Python-OpenCV中的图像处理-模板匹配 模板匹配单对象的模板匹配多对象的模板匹配 模板匹配 使用模板匹配可以在一幅图像中查找目标函数: cv2.matchTemplate(), cv2.minMaxLoc()模板匹配是用来在一副大图中搜寻查找模版图像位置的方法。 OpenCV 为我们提…...

模拟队列(c++题解)

实现一个队列,队列初始为空,支持四种操作: push x – 向队尾插入一个数 xx;pop – 从队头弹出一个数;empty – 判断队列是否为空;query – 查询队头元素。 现在要对队列进行 MM 个操作,其中的…...

Redis_哨兵模式

9. 哨兵模式 9.1 简介 当主库宕机,在从库中选择一个,切换为主库。 问题: 主库是否真正宕机?哪一个从库可以作为主库使用?如何实现将新的主库的信息通过给从库和客户端? 9.2 基本流程 哨兵主要任务: 监控选择主库通知 会有…...

Mysql中如果建立了索引,索引所占的空间随着数据量增长而变大,这样无论写入还是查询,性能都会有所下降,怎么处理?

索引所占空间的增长确实会对MySQL数据库的写入性能和查询性能造成影响,这主要是由于索引数据过多时会导致磁盘I/O操作变得非常频繁,从而使性能下降。为此,可以采取以下几种方式来减缓这种影响: 1. 限制索引的大小:可以…...

MySQL 约束

查看约束 select * from information_schema.table_constraints where table_name要查看的表名按约束的作用范围 列级约束: 将此约束声明在对应字段的后面 表级约束:在表中所有字段都声明完,在所有字段的后面声明的约束,可以声…...

unity实现角色体力功能【体力条+体力计算】

导读:实现功能 1、角色体力计算 2、角色疲劳动画 3、体力条制作、跟随 默认做好角色的idle/run/walk动画、切换和玩家输入,我使用的是新输入系统,动画时单变量混合树,参数Sports。 【每一部分功能根据自己需求观看哦】 1、角色体…...

【深度学习所有损失函数】在 NumPy、TensorFlow 和 PyTorch 中实现(1/2)

一、说明 在本文中,讨论了深度学习中使用的所有常见损失函数,并在NumPy,PyTorch和TensorFlow中实现了它们。 二、内容提要 我们本文所谈的代价函数如下所列: 均方误差 (MSE) 损失二进制交叉熵损失加权二进…...

七夕好物分享,哪些礼物适合送男/女朋友?这几款好物最为合适!

七夕是个值得纪念的日子,牛郎织女鹊桥相会的故事百年流传,七夕是一个表达爱意的节日,送礼物是必不可少的,情侣们可以选择一份有意义的礼物,也可以选择对方需要的东西当做礼物来赠送,总的来说,送…...

C语言学习系列-->看淡指针(2)

文章目录 前言一、数组名的理解二、使用指针访问数组三、一维数组传参本质四、二级指针五、指针数组六、指针数组模拟二维数组 前言 不把指针学的扎实&#xff0c;可不敢说自己C语言基础学的好 一、数组名的理解 #include <stdio.h> int main() {int arr[10] { 1,2,3,4…...

Java基础篇--Character 类

Character 类是用来操作单个字符的&#xff0c;它将 char 值包装在一个对象中。 实际上&#xff0c;在 Java 中&#xff0c;char 是基本数据类型&#xff0c;而 Character 是 char 的包装类。通过 Character 类&#xff0c;可以使用一系列方法来操作字符。在创建 Character 对…...

Flutter参考资料

Flutter 官网 : https://flutter.dev/ Flutter 插件下载地址 : https://pub.dev/packages Flutter 开发文档 : https://flutter.cn/docs ( 强烈推荐 ) 官方 GitHub 地址 : https://github.com/flutter Flutter 中文社区 : https://flutter.cn/ Flutter 实用教程 : https://flut…...

sed命令如何正确修改ini配置文件

需要保证key值的唯一性 function sed_key_value_file(){key$(echo "$1" | sed s/[\/&]/\\&/g)value$(echo "$2" | sed s/[\/&]/\\&/g)# 先删除原有的value&#xff0c;然后添加新的keyvaluesed -i -e "s#${key}.*#${key}${value}#&q…...

【新版系统架构补充】-信息系统基础知识

信息系统 信息系统的5个基本功能&#xff1a;输入、存储、处理、输出和控制 信息系统的分类&#xff08;低级到高级&#xff09;&#xff1a;业务&#xff08;数据&#xff09;处理系统&#xff08;TPS/DPS&#xff09;、管理信息系统&#xff08;MIS&#xff09;、决策支持系…...

安防监控视频汇聚平台EasyCVR分发的FLV视频流在VLC中无法播放是什么原因?

众所周知&#xff0c;TSINGSEE青犀视频汇聚平台EasyCVR可支持多协议方式接入&#xff0c;包括主流标准协议国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。在视频流的处理与分发上&#xff0c;视频监控…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...