首页 > 后端开发 > C++ > 正文

c++怎么实现一个侵入式链表_C++数据结构设计与链表优化方法

尼克
发布: 2025-11-18 17:00:01
原创
562人浏览过
侵入式链表将节点指针嵌入数据结构内部,减少内存分配并提升缓存性能。其核心是list_entry宏,通过offsetof从节点指针反推宿主结构地址,实现高效遍历与操作。

c++怎么实现一个侵入式链表_c++数据结构设计与链表优化方法

实现一个侵入式链表的关键在于将节点信息直接嵌入到数据结构内部,而不是由链表容器额外分配节点。这种方式减少了内存分配次数,提升了缓存命中率,常用于高性能场景如内核开发或实时系统。

什么是侵入式链表

在非侵入式链表中,链表节点包含指向实际数据的指针;而在侵入式链表中,数据结构本身包含链表所需的指针成员(如 next 和 prev)。这意味着对象必须“知道”自己正被用于链表管理。

优点包括:

  • 减少内存分配:无需为链表节点单独申请空间
  • 提高性能:更好的局部性,减少指针跳转
  • 确定性:适用于不允许动态分配的环境

基本结构设计

定义一个基础的链表节点结构,通常作为其他结构的成员:

立即学习C++免费学习笔记(深入)”;

struct list_node {
    struct list_node* next;
    struct list_node* prev;
};
<h1>define list_entry(ptr, type, member) \</h1><pre class='brush:php;toolbar:false;'>((type*)((char*)(ptr) - offsetof(type, member)))
登录后复制

list_entry 是关键宏,用于从 node 指针反推出宿主结构体的地址。它依赖于 offsetof,计算 member 在 type 中的偏移。

使用示例:

知我AI·PC客户端
知我AI·PC客户端

离线运行 AI 大模型,构建你的私有个人知识库,对话式提取文件知识,保证个人文件数据安全

知我AI·PC客户端 35
查看详情 知我AI·PC客户端
struct Person {
    int id;
    char name[32];
    struct list_node node; // 链表节点嵌入
};
登录后复制

链表操作实现

实现基本的初始化、插入和删除操作:

void list_init(struct list_node* head) {
    head->next = head;
    head->prev = head;
}
<p>void list_insert(struct list_node<em> prev, struct list_node</em> next, struct list_node* new_node) {
new_node->next = next;
new_node->prev = prev;
prev->next = new_node;
next->prev = new_node;
}</p><p>void list_add_tail(struct list_node<em> head, struct list_node</em> new_node) {
list_insert(head->prev, head, new_node);
}</p><p>void list_del(struct list_node* node) {
node->prev->next = node->next;
node->next->prev = node->prev;
node->next = nullptr;
node->prev = nullptr;
}</p>
登录后复制

这些是底层操作。添加元素时,直接传入其 node 成员地址即可。

遍历链表并访问宿主结构:

struct list_node* curr;
for (curr = head.next; curr != &head; curr = curr->next) {
    struct Person* p = list_entry(curr, struct Person, node);
    printf("ID: %d, Name: %s\n", p->id, p->name);
}
登录后复制

优化与注意事项

侵入式链表虽高效,但也有一些限制和优化点:

  • 一个对象只能属于一种链表类型(除非定义多个 node 成员)
  • 结构体内存布局需明确,避免 padding 影响 offsetof
  • 可扩展支持双链表、单链表、无锁链表等变种
  • 结合模板(C++)可提升类型安全,避免宏出错

C++ 中可用模板封装,例如:

template <typename T>
class intrusive_list {
    struct Node {
        Node* next;
        Node* prev;
    };
    Node* head;
public:
    void add(T* obj) {
        Node* node = &obj->node; // 假设 T 有 node 成员
        // 插入逻辑
    }
};
登录后复制

基本上就这些。侵入式链表适合对性能敏感的场景,设计上更贴近硬件,但牺牲了一定灵活性。理解其原理有助于写出更高效的 C/C++ 数据结构。

以上就是c++++怎么实现一个侵入式链表_C++数据结构设计与链表优化方法的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号