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

嵌入式day39

内核链表:有头双向循环链表

内核链表中不在结点中存放数据,只有前驱结点和后驱结点

将节点存放在数据中

内核链表提供两个宏来获取结构体中的结点

offsetof

获取结构体成员到结构体开头的偏移量

contianer_of

通过偏移量获取结构体首地址

结构体第一个成员的首地址即为结构体的首地址,将结点放在结构体的成员的第一个位置,链表的首地址即为结构体的首地址,方便访问结构体的其他成员数据。

函数指针:指向函数的指针

返回值 (*函数指针名)(形参表)

使用:

函数指针(实参);

指针函数:返回值为指针的函数

1.返回的指针不能指向一个局部变量的空间

2.可以返回malloc、全局变量、静态变量

3.对指针的返回值进行判空

内核链表特点:

  1. 高效的数据组织

    内核链表通过指针将一系列数据节点连接成链,这种结构允许在不需要预先知道数据总量的情况下,动态地分配空间。这使得内核能够高效地管理内存资源,特别适用于那些数据项数量不确定或经常变化的场景。
  2. 灵活的插入和删除操作

    相比于数组等静态数据结构,内核链表在插入和删除数据项时更加灵活和高效。在链表中,可以在任意位置实时插入或删除数据项,而无需移动其他数据项,从而减少了操作的时间和空间复杂度。
  3. 双向循环链表的高效性

    Linux内核中广泛使用的双向循环链表具有极高的效率。这种链表结构使得查找头节点、尾节点、直接前驱和直接后继的时间复杂度均为O(1),大大提升了链表操作的性能。
  4. 代码重用和模块化设计

    内核链表的设计遵循了代码重用和模块化设计的原则。通过定义一个通用的list_head结构,内核开发人员可以轻松地构造和操作不同对象的列表,而无需为每类对象编写专用的链表函数。这种设计不仅减少了代码的冗余,还提高了代码的可维护性和可扩展性。
  5. 良好的扩展性和通用性

    内核链表本身不包含数据域,只包含指针域。这使得链表结构能够非常灵活地与各种数据类型结合使用。在需要组织数据时,只需在数据结构中添加一个list_head成员即可将其纳入链表管理。这种设计使得内核链表能够适用于各种复杂的数据组织场景。
  6. 安全性考虑

    在删除链表节点时,内核链表会将节点的prevnext指针分别设置为特定的“毒化”值(如LIST_POISON1LIST_POISON2),以确保被删除的节点不会被意外访问,从而提高了链表操作的安全性。

http://www.kler.cn/a/292142.html

相关文章:

  • 51单片机基础05 定时器
  • 27-压力测试
  • HBuilder(uniapp) 配置android模拟器
  • MySQL:表设计
  • 网络安全之WINDOWS端口及病毒编写
  • docker部署bitnami/etcd:latest
  • 828华为云征文|基于Flexus云服务器X实例的应用场景-定时给微信群中推送新闻简报
  • 【Python】企业排名、地域分布与词云分析可视化
  • 23种设计模式(四) —— 手写实现 Factory Method 模式 (将具体交给子类)
  • charles使用ssl证书抓包https请求失败解决方案
  • ffmpeg音视频开发从入门到精通——常用结构体介绍(一)
  • Node.js sqlite3:Statement对象详解
  • Ubuntu下pdf操作
  • 【免费分享】高斯过程回归(Gaussian process regression)原理详解及MATLAB代码实战
  • [rk3399 android11]关闭声卡
  • 【docker】docker 简介
  • Windows用户取消共享文件夹密码方法(Method for Windows Users to Cancel Shared Folder Password)
  • Redis 主从复制、切片集群
  • 前端框架有哪些?
  • python正则表达式大全
  • 21.新增管理员页面制作
  • 9月5日复盘日记
  • pytorch计算张量中三维向量的欧式距离
  • WWDG—窗口看门狗
  • Claude的小白入门指南
  • 无人机之摄像头篇