当前位置: 首页 > 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缓存)里加快寻址与执行过程让循环代码变得更紧凑

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 下载外文文献的常用方法
  • mysql高可用之组复制 (MGR)
  • MyBatis的学习————下篇
  • 西门子PLC控制激光读头,profient转Ethernet IP网关应用
  • 【前端面试】操作系统
  • GaussDB 24.1.30 分布式3节点命令行方式部署
  • 在 CentOS 7 上安装 LNMP 环境:MySQL 8.0、PHP 8.3 和 ThinkPHP 8.0
  • 基于 Redis 的 HyperLogLog 实现了 UV 的统计
  • C# 如何实现接口事件:详解与示例
  • 考试:计算机网络(01)
  • python循环访问excel的某一列从某行开始的内容
  • 139.单词拆分
  • 扑捉一只耿鬼(HTML文件)
  • 【C++】初识C++模板与STL
  • 景芯SoC A72实战反馈
  • hexo+github搭建个人博客
  • Angular Elements 及其运作原理
  • Cookie 在前端中的实践
  • ECMAScript6(0):ES6简明参考手册
  • egg(89)--egg之redis的发布和订阅
  • gulp 教程
  • Laravel5.4 Queues队列学习
  • Node 版本管理
  • Sass Day-01
  • webpack4 一点通
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 百度地图API标注+时间轴组件
  • 反思总结然后整装待发
  • 十年未变!安全,谁之责?(下)
  • 我建了一个叫Hello World的项目
  • 小而合理的前端理论:rscss和rsjs
  • 阿里云ACE认证之理解CDN技术
  • #Lua:Lua调用C++生成的DLL库
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (动态规划)5. 最长回文子串 java解决
  • (二)Kafka离线安装 - Zookeeper下载及安装
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • (自用)网络编程
  • .md即markdown文件的基本常用编写语法
  • .Net CF下精确的计时器
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .NET下的多线程编程—1-线程机制概述
  • .net中应用SQL缓存(实例使用)
  • @ResponseBody
  • [ C++ ] 继承
  • [ 数据结构 - C++]红黑树RBTree
  • [ACM独立出版]2024年虚拟现实、图像和信号处理国际学术会议(ICVISP 2024)