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缓存)里加快寻址与执行过程让循环代码变得更紧凑
。
相关文章:
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 "rockch…...
顶级域名服务器 - TLD服务器
TLD服务器(顶级域名服务器)是负责管理互联网域名系统(DNS)中所有顶级域名(Top-Level Domains, TLDs)的DNS记录的服务器。顶级域名是域名层级结构中的最高级别,位于域名的最右侧,例如…...

【LeetCode】01.两数之和
题目要求 做题链接:1.两数之和 解题思路 我们这道题是在nums数组中找到两个两个数使得他们的和为target,最简单的方法就是暴力枚举一遍即可,时间复杂度为O(N),空间复杂度为O(1)。…...

便宜好用的云手机盘点
云手机作为一种新型远程计算服务,凭借其便利性、高效性和可扩展性,迅速成为了用户的热门选择。然而,面对市场上众多的云手机品牌,如何选择一款性价比高且体验良好的云手机?本文将为您盘点几款便宜好用的云手机产品。 雷…...

pdf怎么压缩小一些?推荐的几种PDF压缩方法
pdf怎么压缩小一些?在工作中,我们经常处理PDF文件。大文件不仅存储麻烦,还会拖慢传输速度。因此,我们通常希望将这些文件压缩成更小的尺寸。压缩后的文件更便于分享和管理,适用于云存储、社交媒体或其他在线平台&#…...

Linux终端简单配置(Vim、oh-my-zsh和Terminator)
文章目录 0. 概述1. 完整Vim配置2. Vim配置方案解释2.1 状态行与配色方案2.2 文件管理与缓存设置2.3 搜索与导航优化2.4 缩进与格式化设置2.5 粘贴模式快捷切换2.6 文件编码与格式2.7 性能优化 3. 安装 Oh My Zsh 及配置3.1 安装 Oh My Zsh3.2 Oh My Zsh 配置 3. Terminator终端…...

js模块化 --- commonjs规范 原理详解
什么是commonjs规范 commonjs是一种模块化规范(nodejs的默认模块化规范,新版的nodejs已经支持es6的模块化,但它默认任然使用的是commonjs),通俗的说它将代码分割成了一个一个的模块,让不同的模块拥有自己独…...

kubeadm部署 Kubernetes(k8s) 高可用集群【V1.28 】
kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。 calico.yaml kubernertes-dashboard.yaml 1. 安装要求 在开始之前,部署Kubernetes集群机器需要满足以下几个条件: 10台机器,操作系统Openeuler22.03 LTS SP4硬件配置&…...

【MySQL】MySQL Workbench下载安装、环境变量配置、基本MySQL语句、新建Connection
1.MySQL Workbench 下载安装: 进入网址:MySQL :: MySQL Workbench Manual :: 2 Installation (1)点击“MySQL Workbench on Windows”(下载Windows版本)(2)点击“Installing” &…...
CrowdStrike 的失败如何凸显了左移测试的重要性
通过自动化软件测试并将其左移,组织可以显著降低 CrowdStrike 等事件发生的风险。继续阅读,了解采用左移测试方法的强大之处。 Parasoft下载 测试中偷工减料的风险 CrowdStrike 软件更新失败是一个重要的教训,它让我们认识到早期、自动…...

HarmonyOS开发实战( Beta5版)高负载组件的渲染实践规范
简介 在应用开发中,有的页面需要在列表中加载大量的数据,就会导致组件数量较多或者嵌套层级较深,从而引起组件负载加重,绘制耗时增长。虽然可以通过组件复用避免组件重复创建,但是如果每个列表项中包含的组件较多&…...

NLP从零开始------16.文本中阶处理之序列到序列模型(1)
1. 序列到序列模型简介 序列到序列( sequence to sequence, seq2seq) 是指输入和输出各为一个序列(如一句话) 的任务。本节将输入序列称作源序列,输出序列称作目标序列。序列到序列有非常多的重要应用, 其中最有名的是机器翻译( machine translation), 机…...

【匈牙利汽车产业考察,开启新机遇】
匈牙利汽车工业发展历史悠久,拥有发达的基础设施和成熟的产业基础,全球20大汽车制造厂商中,有超过14家在匈牙利建立整车制造工厂和汽车零部件生产基地,比亚迪、宁德时代、欣旺达、蔚来等企业纷纷入驻。匈牙利位于东西方交汇处&…...

并行程序设计基础——动态进程管理
目录 一、组间通信域 二、动态创建新的MPI进程 1、MPI_COMM_SPAWN 2、MPI_COMM_GET_PARENT 3、MPI_COMM_SPAWN_MULTIPLE 三、独立进程间的通信 1、MPI_OPEN_PORT 2、MPI_COMM_ACCEPT 3、MPI_CLOSE_PORT 4、MPI_COMM_CONNECT 5、MPI_COMM_DISCONNECT 6、MPI_PUBLISH…...
C# 字符串(String)使用教程
在 C# 中,您可以使用字符数组来表示字符串,但是,更常见的做法是使用 string 关键字来声明一个字符串变量。string 关键字是 System.String 类的别名。 创建 String 对象 您可以使用以下方法之一来创建 string 对象: 通过给 Str…...
django之ForeignKey、OneToOneField 和 ManyToManyField
在Django中,ForeignKey、OneToOneField 和 ManyToManyField 是用于定义模型之间关系的字段类型。 ForeignKey ForeignKey 用于定义多对一的关系。例如,一个Employee可以属于一个Department,一个Department可以有多个Employee。 from djang…...

java.lang.IndexOutOfBoundsException: setSpan ( 0...x ) ends beyond length X
1,可能是EditText,setSelection(x)时超过了 输入框内容的实际长度导致的。 2,手机开启“拼写检查功能”,EditText设置了最大长度,选择提示的某一项文案时超过设置的最大长度限制,导致崩溃。 针对情况2 开…...

技术进展:CH-90树脂在去除硫酸钠柠檬酸钠溶液中铁锰离子上的应用
随着环境保护法规的日趋严格,以及工业生产中对产品纯度要求的不断提高,去除废水中的重金属离子已成为一个亟待解决的问题。铁和锰作为常见的杂质离子,在电池制造等行业中,对溶液纯度的影响不容忽视。 三元前驱体废水中通常含有硫…...

录屏时摄像头无法识别?如何录屏时打开摄像头,解决方案及录屏软件推荐
在数字时代,无论是游戏玩家、在线教育者还是企业培训师,录屏软件都已成为日常工作和娱乐中不可或缺的工具。但有时候想录制人物摄像头画面的时候,当录屏软件无法识别到摄像头时,这无疑会给用户带来不小的困扰。本文将提供一系列解…...
达梦数据库-DM8 企业版安装指南
一、DM8 企业版简介 达梦数据库(DM8)是中国自主研发的一款高性能数据库管理系统,广泛应用于企业级应用场景。DM8 企业版具备高可用性、强一致性和高性能等特点,支持多种操作系统和硬件平台。本文将详细介绍如何在 Kylin 操作系统上安装达梦数据库 DM8 企业版。 二、安装前…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...