C++的侵入式链表

embedded/2024/12/26 3:15:55/

非侵入式链表

非侵入式链表是一种链表数据结构,其中每个元素(节点)并不需要自己包含指向前后节点的指针。链表的结构和节点的存储是分开的,链表容器会单独管理这些指针。

常见的非侵入式链表节点可以由以下所示,即,在链表节点中包含数据:

在这里插入图片描述

其中每个节点都形如:

struct Node {T data;Node* prev;Node* next;
};

STL标准库就使用的是非侵入式容器。

侵入式链表

侵入式链表是一种链表数据结构,其中每个元素(节点)本身就包含了指向前后节点的指针(prev 和 next)。也就是说,链表的结构是“侵入”到节点内部的,节点必须事先包含这些指针。

侵入式list与STL标准库中的list不同.STL标准库中的list容器将data与prev指针和next指针紧耦合,这就导致每向list中插入一个新元素就要涉及到内存的分配,这对于在堆上分配的内存而言是一种时间浪费。

侵入式链表与之相反,在业务数据结构中包含链表节点结构:

在这里插入图片描述

template <typename T>
struct IntrusiveListNode {IntrusiveListNode* prev;IntrusiveListNode* next;T* owner;
};struct UserData {// ...InstruiveListNode list;
};

优点:

  • 更好的data locality:非侵入式结构std::list<T*>遍历过程中需要对T*解引用才能访问T内部数据,但侵入式结构的next和T内部的数据结构是放在一起的,无需额外解引用。
  • 更友好的API:拿到数据后就可以直接将这个节点从链表去除
  • 需要用户自己管理数据节点生命周期

应用举例:Linux源码的侵入式链表结构:

struct list_head {struct list_head *next, *prev;
};
//使用list_head的调度模块
struct task_group {// 省略一些业务逻辑struct list_head list;
};
/** Default task group.* Every task in system belongs to this group at bootup.*/
struct task_group root_task_group;
LIST_HEAD(task_groups);list_add(&root_task_group.list, &task_groups);

参考链接

  1. https://hcoona.github.io/Data-Structure/instrusive-linked-list-summary/
  2. https://zhiqiang.org/coding/boost-intrusive-containers.html

http://www.ppmy.cn/embedded/148786.html

相关文章

[Python] 圆形嵌套图Circular Packing

在Python中&#xff0c;生成圆形嵌套图&#xff08;Circular Packing&#xff09;通常涉及使用图形库或可视化工具来绘制一系列嵌套的圆形&#xff0c;这些圆形可能代表某种层次结构或数据分布。一个流行的选择是使用 matplotlib 库&#xff0c;它是Python中一个广泛使用的绘图…

iClient3D for Cesium在Vue中快速实现场景卷帘

作者&#xff1a;gaogy 1、背景 iClient3D for Cesium是由SuperMap提供的一个前端3D地图客户端&#xff0c;提供了丰富的功能与接口&#xff0c;使得开发者能够在Web应用中快速集成并展现3D地理信息。而在Vue框架中集成iClient3D&#xff0c;不仅可以利用Vue的响应式特性提高开…

lxml提取某个外层标签里的所有文本

html如下 <div data-v-1cf6f280"" class"analysis-content">选项D错误&#xff1a;<strong>在衡量通货膨胀时&#xff0c;</strong><strong>消费者物价指数使用得最多、最普遍</strong>。 </div> 解析html文本 fro…

Word表格批量添加题注代码

操作步骤 打开word&#xff0c;点击“开发工具”&#xff0c;进入Visual Basic&#xff0c;点击“Normal”,右键&#xff0c;插入“模块”。输入代码如下&#xff1a; Sub 批量添加表格题注() For i 1 To ActiveDocument.Tables.CountActiveDocument.Tables(i).Range.Insert…

SpringMVC的URL组成,以及URI中对/斜杠的处理,解决IllegalStateException: Ambiguous mapping

SpringMVC的URL组成 ip 端口号 上下文 类上的RequestMapping的URI 方法上的RequestMapping的URI 规则 非空URI前会自动拼接/连续的斜杠会被替换成单个斜杠方法的URI前没有斜杠与只有一个斜杠的两种接口&#xff0c;同时存在时&#xff0c;拼接前面的斜杠后再替换重复斜杠&…

点亮核心板小灯 STM32U575

将核心板上的运行状态指示灯点亮 任务分析 灯如何点亮 如何看开发板原理图 开发板上的灯硬件组成 原理图 原理图&#xff08;Schematic Diagram&#xff09;&#xff0c;也称为电路图或电气图&#xff0c;是一种图形表示方法&#xff0c;用于展示电子系统或电路的工作原理和…

机器学习常用术语

目录 概要 机器学习常用术语 1、模型 2、数据集 3、样本与特征 4、向量 5、矩阵 6、假设函数与损失函数 7、拟合、过拟合与欠拟合 8、激活函数(Activation Function) 9、反向传播(Backpropagation) 10、基线(Baseline) 11、批量(Batch) 12、批量大小(Batch Size)…

第一节:电路连接【51单片机-L298N-步进电机教程】

摘要&#xff1a;本节介绍如何搭建一个51单片机L298N步进电机控制电路&#xff0c;所用材料均为常见的模块&#xff0c;简单高效的方式搭建起硬件环境 一、硬件清单 ①51单片机模块 ②恒流模块 ③开关电源 ④L298N模块 ⑤二相四线步进电机 ⑥电线若干 二、接线 三、L298N模…