深入理解侵入式容器与非侵入式容器(intrusive containers)

news2024/11/17 11:32:07

再传统的数据结构的实现中,分为侵入式容器和非侵入式容器两种

侵入式容器

这也是教材喜欢使用的数据结构的实现方式 ,将数据结构放入类中,所以先讲这个

非侵入式容器:

struct ListNode {
    ListNode *prev, *next;
    int value;
};

这时候如果要用模板实现的话就是:

template <typename T>
struct ListNode {
    ListNode *prev, *next;
    T value;
};

可以看见数据都是放在类中吗,这也是平常在教学中常用的数据结构组织方式

非侵入式容器

C++标准的STL库中实现的容器,甚至于Redis中的容器中实现的容器都是非侵入式容器

关于在linux的kernel/inclue/linux/types.h源码中链表的实现:

struct list_head {
    struct list_head *next, *prev;
};

 看一看到再数据结构中,只再里面存储了数据类型的前驱节点和后驱节点

这时候,如果想要存储数据,需要创建指定的数据结构

Struct node{
	int sum;
	list_head  list;
}

这时候的数据结构示意图如下:

 

关于Ridis的adlist.h源码中:

typedef struct listNode {
    struct listNode *prev;
    struct listNode *next;
    void *value;
} listNode;

在value中通过一个指针指向存储数据结构的区域 

这时候,可以实现一个数据结构比如说struct

struct A{
    int data;
}

这时候接口已用指针读到这个数据结构:

listNode *Node;
int v =(int*)Node->value;

非侵入式容器总结和优势

可有看到再以上的非侵入式容器中数据没有直接放入类中,这样存储有什么好处呢?

这样存储数据类型有着非常的灵活性,解耦了容器和数据

比如说把

typedef struct listNode {
    struct listNode *prev;
    struct listNode *next;
    void *value;
} listNode;

放入h文件中

struct A{
    int data;
}

放入cpp文件后

每次编译的时候,h文件需要全部复制到cpp文件中

这时候,如果修改类存储的数据结构的时候,放如果使用侵入式的方法,就会发现,h中改动一下,就要重新编译好久,单数放在cpp中,就会使得编译的流程大大减少

另一方面:

非入侵式容器不需要使用模板泛型编程,但是这不意味着彻底抛弃模板,在boost库的intrusive中就需要使用typename

侵入式容器总结和优势

在非侵入式容器中,每回寻找数据需要指针再次定位,但在现在的电脑上,这点性能开销简直可以忽略不记

创建需要在两个空间上New两次,其实也影响不大

其实它最不好地方在于在松散的内存布局对于cache line及其不友好

那么侵入式容器的优势就出来了,可以使得内存紧密排列,从而提高chache的命中率

另外重要的一点就是:

在STL的容器都是使用allocator分配器,如果使用侵入式容器,由于调用关系数据只能分配在堆上面

但是如果使用了侵入式容器的话,数据可以分配在栈上面,例如使用plancement new

在EASTL库中(由于游戏的特殊性,一般游戏需要构建自己的内存池,所以EASTL这套EA开发的高性能库成了不烧游戏开发的选择),就提供了intrusive容器的使用

扩展:从容器到侵入式和非侵入式框架设计

侵入式框架:引入了框架,对现有的类的结构有影响,需要实现框架某些接口或者基础某些特定的类。

非侵入式框架:引入了框架,对现有的类结构没有影响,不需要实现框架某些接口或者特定的类。

现在sprinresprinredis的框架设计倾向于非侵入式框架,这源于代码设计高内聚,低耦合原则

就拿spring举例吧,在java常用的spring框架中,就是常用的非侵入式框架设计,利用反射和动态调节涌来实例化对象,代码中没有与spring耦合交叉的类,这时候完全可以换一套框架,但是对原来的代码没影响,这么说当然夸张了,有一点侵入还是有的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/642145.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

五分钟搞懂分布式流控算法

流控是任何一个复杂系统都必须考虑的问题&#xff0c;本文介绍并比较了不同的流控算法&#xff0c;从而帮助我们可以基于系统需求和架构选择合适的方案。原文&#xff1a;Distributed Rate-Limiting Algorithms[1] 当我们设计分布式流控系统&#xff08;distributed rate-limit…

华硕TUF GAMING B460M i5-10500 电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件配置 硬件型号驱动情况 主板华硕TUF GAMING B460M-PLUS (LPC Controller B460芯片组 处理器特尔 Core i5-10500 3.10GHz六核已驱动 内存16 GB (IstRI DDR4 2666MH…

在字节划水的4年,很真实...

先简单交代一下&#xff0c;我是某不知名211的计算机本硕&#xff0c;18年毕业加入滴滴&#xff0c;之后跳槽到了头条&#xff0c;一直从事测试开发相关的工作。之前没有实习经历&#xff0c;算是四年半的工作经验吧。 这四年半之间完成了一次晋升&#xff0c;换了一家公司&am…

微信可以聚合聊天吗?如何同时管理多个微信?

现在很多企业用微信做私域流量运营&#xff0c;在里面搭建自己的私域流量。随着客户资源逐渐增多&#xff0c;需求增加&#xff0c;不仅需要联系客户&#xff0c;还要联系各大代理&#xff0c;开通多个微信号无疑是最佳方案。 但是不少做电商的朋友表示&#xff0c;微信号越来…

代理ip数据采集的优缺点

随着互联网时代的到来&#xff0c;数据已经成为企业发展和决策的关键。但是&#xff0c;不同的网站它对于数据访问的限制和反爬虫措施却是给企业的数据采集带来了挑战。针对这一问题&#xff0c;代理IP数据采集技术应运而生。但是使用代理ip来进行数据采集也有优缺点。 一、代理…

JS WEB框架Express日志模块winston和express-winston以及winston-daily-rotate-file优化

1.前言 1.Express的日志模块winston和express-winston已经提供了开箱即用的大多数功能&#xff0c;但是和其他语言相比&#xff0c;还缺失对日志记录的当前文件和行号的支持&#xff0c;需要自己实现&#xff0c;以此记录一下。 2.express-winston主要用于记录请求进入和结束时…

【运筹优化】ALNS自适应大领域搜索算法求解TSP问题 + Java代码实现

文章目录 一、TSP问题简介二、数学建模三、实现细节四、案例实战4.1 测试案例说明4.2 Java 完整代码4.2.1 TSP_Instance 实例类4.2.2 TSP_Solution 结果类4.2.3 TSP_Util 工具类4.2.4 TSP_Solver_ALNS 算法类4.2.5 RunAndPlot 运行类 4.3 运行结果展示 一、TSP问题简介 旅行推…

MySQL登录时报错:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘解决办法

问题描述 在云服务器使用 docker安装的Mysql5.7数据库&#xff0c;刚开始的时候使用正常&#xff0c;后面突然有一天就连接不上了&#xff0c;报错为: ERROR 1045 (28000): Access denied for user root1xxx(using password:YES)&#xff0c; 当登录MySQL数据库出现 Error 1045…

python套接字(三):结合pyside2实现多人聊天室

文章目录 前言一、准备1、安装pyside22、设计界面 二、代码实现1、服务器端2、客户端 三、运行 前言 上一章python套接字(二)&#xff1a;实现一个服务器和多客户端连接&#xff0c;大概实现了多人聊天室功能&#xff0c;但是比较简陋&#xff0c;本篇内容将结合pyside2做一个…

车间主任、班组长必读:生产车间的现场管理

与工厂车间操作层&#xff08;一线员工&#xff09;接触最多的基层管理者&#xff0c;即我们通常所说的班组长、车间主任等&#xff0c;他们是将企业战略规划落实到具体工作当中的终端管理者。 一线班组长的“角色” 1、责任者 对企业来说&#xff0c;班组长是基层的治理员&am…

MySQL高级篇第二天

文章目录 一、Mysql的体系结构概览 二、 存储引擎 三、优化SQL步骤 一、Mysql的体系结构概览 整个MySQL Server由以下组成 Connection Pool : 连接池组件 Management Services & Utilities : 管理服务和工具组件 SQL Interface : SQL接口组件 Parser : 查询分析器组件 O…

游戏测试与一般的软件测试的区别在哪里?

有很多同学进入测试行业之后&#xff0c;一直从事的是软件测试的工作&#xff0c;然后跳槽时遇到一些游戏的公司的面试&#xff0c;就会有点慌&#xff0c;我做的都是软件测试&#xff0c;能胜任游戏测试么&#xff1f; 所以&#xff0c;今天我们需要先来了解一下&#xff0c;…

科技政策 | 《深圳市加快加快推动人工智能高质量发展高水平应用行动方案(2023—2024年)》发布

原创 | 文 BFT机器人 导语 Introduction 近日&#xff0c;深圳市发布了《深圳市加快推动人工智能高质量发展高水平应用行动方案&#xff08;2023-2024年&#xff09;》旨在以更大热情拥抱创新&#xff0c;打造最好生态&#xff0c;推动人工智能高质量发展和全方位各领域高水平…

C语言-关键字

关键字就是c语言已经定义好的名字&#xff0c;直接可以拿过来使用&#xff0c;不需要再次定义 1 数据类型相关的关键字 用于定义变量或者类型 定义变量的语法结构&#xff1a; 类型 变量名&#xff1b; 拓展&#xff1a;变量名属于标识符&#xff0c;标识符&#xff08;变量…

关于Axios发请求(get或post)的参数问题

版本说明&#xff1a; {"name": "wx_vue_3.0","version": "0.1.0","private": true,"scripts": {"serve": "vue-cli-service serve","build": "vue-cli-service build"…

K-Means聚类算法

引言 聚类算法是传统机器学习算法中比较重要的一个算法&#xff0c;也是工程项目当中一个比较常用的算法。 一. 分类与聚类 分类 分类其实是从特定的数据中挖掘模式&#xff0c;作出判断的过程。 分类学习主要过程&#xff1a; &#xff08;1&#xff09;训练数据集存在一个类…

mathtype公式右编号对齐

mathtype公式右编号对齐 1.选中文中编辑好的公式&#xff0c;复制 2.mathtype里的点击右编号&#xff0c;将上面复制的公式粘贴到新出现的框内 3.编号设置

聚类效果评估

目录 1.轮廓系数&#xff08;Silhouette Coefficient&#xff09; 1.1 为什么轮廓系数可以评价聚类效果的好坏&#xff1f; 1.2 平均轮廓系数 2. 其他聚类质量函数 2.1方差比准则(Variance Ratio Criterion, VRC) 2.2 戴维斯-博尔丁指数(Davies-Bouldin指数,DB指数) 评价聚…

linux- 定时任务清理日志

定时任务清理日志 一、查找并删除文件1.1 查找文件1.2 查找并删除 二、计划任务&#xff1a;2.1 创建shell脚本&#xff0c;并分配权限2.2 编辑shell脚本2.3 计划任务 linux是一个很能自动产生文件的系统&#xff0c;在实际部署运行中&#xff0c;发现日志文件会占用大量内存&a…

SpringBoot+Thymeleaf 后端转html,pdf HTML生成PDF SpringBoot生成PDF Java PDF生成

SpringBoot 生成PDF Thymeleaf企业级真实应用&#xff1a;将HTML界面数据转换为PDF输出 参考&#xff1a; https://blog.51cto.com/u_13146445/6190475 https://blog.csdn.net/qq_27242695/article/details/115654447 0. 需求 后端渲染pdf生成 &#xff08;thymeleaf根据已有…