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

Linux sentinel写法

在linux驱动里我们经常能看到类似下面的写法:

static const struct of_device_id asensm6_of_match[] = {{ .compatible = DRIVER_COMPATIBLE },{ /* sentinel */ },
};static const struct of_device_id rockchip_pinctrl_dt_match[] = {{ .compatible = "rockchip,px30-pinctrl",.data = &px30_pin_ctrl },{ .compatible = "rockchip,rv1108-pinctrl",.data = &rv1108_pin_ctrl },{ .compatible = "rockchip,rv1126-pinctrl",.data = &rv1126_pin_ctrl },{ .compatible = "rockchip,rk1808-pinctrl",.data = &rk1808_pin_ctrl },{ .compatible = "rockchip,rk2928-pinctrl",.data = &rk2928_pin_ctrl },{ .compatible = "rockchip,rk3036-pinctrl",.data = &rk3036_pin_ctrl },{ .compatible = "rockchip,rk3066a-pinctrl",.data = &rk3066a_pin_ctrl },{ .compatible = "rockchip,rk3066b-pinctrl",.data = &rk3066b_pin_ctrl },{ .compatible = "rockchip,rk3128-pinctrl",.data = (void *)&rk3128_pin_ctrl },{ .compatible = "rockchip,rk3188-pinctrl",.data = &rk3188_pin_ctrl },{ .compatible = "rockchip,rk3228-pinctrl",.data = &rk3228_pin_ctrl },{ .compatible = "rockchip,rk3288-pinctrl",.data = &rk3288_pin_ctrl },{ .compatible = "rockchip,rk3308-pinctrl",.data = &rk3308_pin_ctrl },{ .compatible = "rockchip,rk3328-pinctrl",.data = &rk3328_pin_ctrl },{ .compatible = "rockchip,rk3368-pinctrl",.data = &rk3368_pin_ctrl },{ .compatible = "rockchip,rk3399-pinctrl",.data = &rk3399_pin_ctrl },{},
};

可以看到数组声明初始化时的尾部会有一个空白的{}, 对于GCC编译器来说它会被初始化为0,也就是说{}等价于{.a = 0, .b = 0}, linux的用意在于防止数组越界以及不需要去动态计算大小。
例如我们现在想遍历一个数组,那么终止条件就是判断当前是否为结束符,如果是结束符则遍历结束。
在声明中使用哨兵主要目的简化链表数组的算法步骤,使得判断终止变得比较单一了,无论什么条件只要遇到了哨兵那就意味着这个数组的遍历该结束了,因为判断比较单一这样能够提升CPU分支预测命中率,因为如果判断语句较为复杂会导致CPU分支预测失败率提高,当分支预测失败时CPU为了保证程序能够正常运行下去会重新回滚去执行这就间接导致了这个代码被放入热路径的概率会非常小。
此外在遍历数组时不需要去关心它的大小了,也不需要去计算,只需要简单的判断是否指向了哨兵元素就可以了,因为它判断的单一性,会让CPU很容易预测并将代码放入热路径(CPU缓存)里加快寻址与执行过程让循环代码变得更紧凑

http://www.lryc.cn/news/430692.html

相关文章:

  • 顶级域名服务器 - TLD服务器
  • 【LeetCode】01.两数之和
  • 便宜好用的云手机盘点
  • pdf怎么压缩小一些?推荐的几种PDF压缩方法
  • Linux终端简单配置(Vim、oh-my-zsh和Terminator)
  • js模块化 --- commonjs规范 原理详解
  • kubeadm部署 Kubernetes(k8s) 高可用集群【V1.28 】
  • 【MySQL】MySQL Workbench下载安装、环境变量配置、基本MySQL语句、新建Connection
  • CrowdStrike 的失败如何凸显了左移测试的重要性
  • HarmonyOS开发实战( Beta5版)高负载组件的渲染实践规范
  • NLP从零开始------16.文本中阶处理之序列到序列模型(1)
  • 【匈牙利汽车产业考察,开启新机遇】
  • 并行程序设计基础——动态进程管理
  • C# 字符串(String)使用教程
  • django之ForeignKey、OneToOneField 和 ManyToManyField
  • java.lang.IndexOutOfBoundsException: setSpan ( 0...x ) ends beyond length X
  • 技术进展:CH-90树脂在去除硫酸钠柠檬酸钠溶液中铁锰离子上的应用
  • 录屏时摄像头无法识别?如何录屏时打开摄像头,解决方案及录屏软件推荐
  • 达梦数据库-DM8 企业版安装指南
  • 心脑血管科董田林医生:心律失常患者饮食,调养秘诀,助你找回健康心跳
  • 期权杂记(一)
  • 【MATLAB源码-第163期】基于matlab的BPSK+瑞利(rayleigh)信道下有无波束成形误码率对比仿真。
  • 【数据分享】2000-2022年我国省市县三级的逐日O3数据(免费获取\excel\shp格式)
  • Python 的http.server库详细介绍
  • 使用ffmpeg在视频中绘制矩形区域
  • 计算机,数学,AI在社会模拟中的应用
  • 【数据结构】排序算法系列——插入排序(附源码+图解)
  • TOMATO靶机漏洞复现
  • 高基数 GroupBy 在 SLS SQL 中的查询加速
  • TP5队列和TP5 使用redis 等相关