当前位置: 首页 > 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.mrgr.cn/news/15076.html

相关文章:

  • Day4 平衡树 线段树
  • Python 如何进行密码学操作(cryptography模块)
  • 数学基础 -- 线性代数之矩阵的秩
  • 云计算基础之Docker
  • linux-centos7 服务器上redis服务已经启动,但是宿主机无法访问,报错:connect timeout
  • Java Excel转PDF(免费)
  • Java Web —— 第九天(事务)
  • 样式(1)——颜色样式
  • 算法的学习笔记—从 1 到 n 整数中 1 出现的次数(牛客JZ43)
  • 【Qt窗口】—— 状态栏
  • 观测云「可观测性解决方案」亮相 828 B2B 企业节
  • 《多模态大规模语言模型基准》综述
  • react.js
  • [M模拟] lc3153. 所有数对中数位不同之和(模拟+按位统计)
  • Flutter-->自定义容器Widget(类比Android自定义ViewGroup)
  • 最新视频合成后调优技术ExVideo模型部署
  • 4 Docker 容器导入导出
  • 神经网络卷积层
  • 零基础一文学会Docker与Kubernetes
  • LVS工作模式