C++——STL之空间配置器

news2024/11/30 7:42:21

在这里插入图片描述

文章目录

  • 1. 什么是空间配置器
  • 2. 为什么需要空间配置器
  • 3. SGI-STL空间配置器实现原理
    • 3.1 一级空间配置器
    • 3.2 二级空间配置器
      • 3.2.1 内存池
    • 3.3 空间配置器的再次封装
    • 3.4 对象的构造与释放
  • 4. 与容器结合

1. 什么是空间配置器

空间配置器,顾名思义就是为各个容器高效的管理空间(空间的申请与回收)的

2. 为什么需要空间配置器

前面在模拟实现vector、list、map、unordered_map等容器时,所有需要空间的地方都是通过new申请的,虽然代码可以正常运行,但是有以下不足之处:
1.空间申请与释放需要用户自己管理,容易造成内存泄漏。
2.频繁向系统申请小块内存,容易造成内存碎片和影响程序运行效率。
3.直接使用malloc与new进行申请,每块空间前有额外空间浪费。
4.申请空间失败怎么应对。
5.未考虑线程安全问题

因此需要设计一块高效的内存管理机制。

那么空间配置器,malloc,堆的关系如下
在这里插入图片描述
用空间配置器效率会更高。

3. SGI-STL空间配置器实现原理

以上提到的几点不足之处,最主要还是:频繁向系统申请小块内存造成的。
那什么才算是小块内存
SGI-STL以128作为小块内存与大块内存的分界线,将空间配置器其分为两级结构,一级空间配置器处理大块内存,二级空间配置器处理小块内存

3.1 一级空间配置器

一级空间配置器原理非常简单,直接对malloc与free进行了封装,并增加了C++中set_new_handle思想。

一级空间配置器的名字是:__malloc_alloc_template
在这里插入图片描述
里面有对malloc和free的封装,那么这个oom_malloc是什么呢
在这里插入图片描述

3.2 二级空间配置器

二级空间配置器专门负责处理小于128字节的小块内存。
如何才能提升小块内存的申请与释放的方式呢
SGI-STL采用了内存池的技术来提高申请空间的速度以及减少额外空间的浪费,采用哈希桶的方式来提高用户获取空间的速度与高效管理

二级空间配置器的名字是:__default_alloc_template

3.2.1 内存池

内存池就是:先申请一块比较大的内存块已做备用,当需要内存时,直接到内存池中去取,当池中空间不够时,再向内存中去取,当用户不用时,直接还回内存池即可
避免了频繁向系统申请小块内存所造成的效率低、内存碎片以及额外浪费的问题。
在这里插入图片描述
这里是用两个指针来管理这个内存池,当我们需要一块小内存时,start就会往后移动,到我们需要的大小时就给我们使用了。

如果我们不使用这些小内存块时,我们怎么还回去呢
这里是使用哈希桶给挂起来,因为查找合适的小块内存时效率比较低。

那是否需要128桶个空间来管理用户已经归还的内存块呢
答案是不需要,因为用户申请的空间基本都是4的整数倍,其它大小的空间几乎很少用到。因此:SGI-STL将用户申请的内存块向上对齐到了8的整数倍。
在这里插入图片描述
二级空间配置器的整体申请内存情况如下
在这里插入图片描述
一开始内存池和桶里面都是空的,此时我们要申请10字节的空间。那么我们就开始计算在那个桶,在1号桶里面没有空间,就会去内存池申请,内存池也没有,就去malloc了。
在这里插入图片描述
malloc会一次申请很大一块空间。然后我们需要10字节,它会一次给我们很多个10字节,把头结点的空间给我们,剩下的挂在桶中。
在这里插入图片描述
因为这样下次我们再申请10字节的空间,就会去桶里面直接找到,然后头删给我们,这样时间复杂度就在O(1)。当我们这段空间不需要在使用了,就头插到桶中,复杂度也是O(1)。

那么这里的内存空间是如何连起来的
源码里是用了一个联合体,原因是:在每段内存空间中会存下一个内存空间的地址,在32位下就是4字节,在64位下就是8字节。当我们把一段空间给用户时,地址就会消失,当不用时,重新头插,地址又有了。这就是为什么以8字节对齐,而不是按照4字节对齐。

流程图如下
在这里插入图片描述

3.3 空间配置器的再次封装

在C++中,用户所需空间可能是任意类型的,有单个对象空间,有连续空间,每次让用户自己计算所需空间总大小不是很友好,因此SGI-STL将空间配置器重新再封装了一层:
在这里插入图片描述

3.4 对象的构造与释放

一切为了效率考虑,SGI-STL决定将空间申请释放和对象的构造析构两个过程分离开,因为有些对象的构造不需要调用析构函数,销毁时不需要调用析构函数,将该过程分离开可以提高程序的性能:
在这里插入图片描述

4. 与容器结合

本例子给出list与空间配置器是如何结合的:
在这里插入图片描述

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

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

相关文章

深入了解Kotlin密封接口的强大功能

深入了解Kotlin密封接口的强大功能 当 Kotlin 首次引入时,开发者迅速爱上了它的强大语言特性,其中包括密封类。然而,有一件事似乎还缺失了:密封接口。当时,Kotlin 编译器无法保证在 Java 代码中无法实现接口&#xff0…

Dart 3.0 语法新特性 | Records 记录类型 (元组)

theme: cyanosis 终于,终于,终于, Dart 支持元组了! 官方称之为 Records 特性,所以入乡随俗,以后中文称之为 记录类型 。官方 对它的介绍 是: Records are an anonymous, immutable, aggregate type. 记录…

I3C仿真:PGY I3C-EX-PD使用

简述 本文所使用的I3C仿真软件是由Prodigy Technovations Pvt. Ltd公司所研发的MIPI PGY-I3C-EX-PD I3C仿真设备,这款设备搭载了配套软件,专门用于模拟I3C设备,它可以实现模拟Master、SLAVE,同时也支持模拟I2C Slave&#xff0c…

sklearn中的特征工程(过滤法、嵌入法和包装法)

目录 ​编辑特征工程的第一步:理解业务 Filter过滤法 ​编辑方差过滤 ​编辑- 相关性过滤 - 卡方过滤 - F检验 - 互信息法 ​编辑嵌入法(Embedded) 包装法(Wrapper) 特征工程的第一步:理解业务 如…

公司大数据CDH技术选型升级为EMR集群的技术调研

大数据技术栈现状 大数据技术整体设计图 当前大数据各组件版本 ZooKeeper 3.4.5 Spark 2.4.0 Hue 4.3.0 Hive 2.1.1 Hbase 2.1.4 Hadoop 3.0.0 Kafka 2.2.1 Phoenix 5.0.0-cdh6.2.0 Dolphinscheduler 3.0.0 Yarn 3.0.0-cdh6.3.2 Logstash 7.7.0 Kibana 7.7.0 Elasticsearch 7…

反涉网犯罪研究 | 电商平台自动收货代码审计

0x00 免责声明 本文仅限于学习讨论与反诈知识的分享,不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本文作者不为此承担任何责任,一旦造成后果请自行承担…

信息发布系统在医院体检中心的运用

随着生活水平条件的提高,大家的健康意识更加强,重视体检的人数也越来越多,因此体检中心,医院体检门诊中心人流量都很大,健康市场空间前景大,各种医疗健康机构快速发展,市场竞争激烈,…

Linux——互斥和同步(二)

目录 信号量 读写信号量 互斥量 RCU机制 虚拟串口驱动加入互斥 完成量 习题 信号量 前面所讨论的锁机制都有一个限制,那就是在锁获得期间不能调用调度器,即不能引起进程切换。但是内核中有很多函数都可能会触发对调度器的调用(在中断的…

Win10笔记本开机黑屏出现白色错误英文无法启动怎么办?

Win10笔记本开机黑屏出现白色错误英文无法启动怎么办?有用户电脑正常开机之后,出现了问题,系统无法正常的启动,出现一些英文错误代码。那么遇到这个情况怎么去进行解决呢?一起来看看以下的解决方法分享吧。 准备工作&a…

C语言数据结构注意点-线性表

目录 关于指针 LinkList L和LinkList *L的区别 初始化注意点 scanf()的操作 顺序表相关操作符号的确定 关于指针 ①指针和指针变量是两个不同的概念,但要注意的是,通常我们叙述时会把指针变量简称为指针。 ②指针变量其实是一个变量&…

FL Studio21中文完整版All Plugins Edition及切换教程

说到制作电音的软件,coco玛奇朵一定会把FL Studio放到第一个来讲。水果是一款为了电子音乐而生的的宿主软件。水果,独特的节拍音序器组件和通道机架与混音台模块打造的编曲“块”的思路。是极为适合于电子音乐的编排。而且随着水果版本不断地升级&#x…

Vite的基本介绍以及优劣势(一文读懂vite)?

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、Vite是什么?二、为什么选Vite?1、现实的问题2、缓慢的服务器启动3、缓慢的更新 三、Vite的优势?四、Vite的劣势?五、Vite以…

深入理解双亲委派机制

一、双亲委派机制委派流程 双亲委派机制,就是JVM虚拟机加载类的时候,会优先委派上级类加载器进行类加载。 1、如果上级类加载器能找到这个类,那就由上级类加载器加载,并且对下级共享,反之不共享。 2、如果上级类加载…

【#ifndef, #define, 和 #endif】

前言 学习AFNetWoring源码的时候,在AFN的h借接口文件又看到了这几个宏定义,学习记录一下。 作用 #ifndef, #define, 和 #endif是C/CPP的预处理指令,常常用来条件编译和防止头文件重复包含。 简介 #ifndef 它是if not define的简写&…

SpringBoot 使用 Sa-Token 完成注解鉴权功能

注解鉴权 —— 优雅的将鉴权与业务代码分离。本篇我们将介绍在 Sa-Token 中如何通过注解完成权限校验。 Sa-Token 是一个轻量级 java 权限认证框架,主要解决登录认证、权限认证、单点登录、OAuth2、微服务网关鉴权 等一系列权限相关问题。 Gitee 开源地址&#xff1…

生信步骤|EffectorP批量预测病原物效应子

EffectorP软件利用机器学习原理,通过事先收集已知的效应子制备训练集,从而实现病原真菌和卵菌的效应子预测[1]。 EffectorP发展史[2]: 1.0版本最初在16年发表于NEW PHYTOLOGIST,实现了机器学习初步预测效应子。 2.0版本在18年发表…

OPPO官宣:哲库解散,哲库是 OPPO 旗下的芯片厂,类似华为海思的角色,有近 3000 名员工

大家好,我是二哥呀。 这两天,互联网最大的声音之一就是,OPPO 将终止芯片业务,相信大多数小伙伴和二哥一样,第一眼看到这则消息的时候,震惊的同时并惋惜! ZEKU 是 OPPO 旗下的芯片厂&#xff0…

Java面试知识点(全)-JVM面试知识点

Java面试知识点(全) 导航: https://nanxiang.blog.csdn.net/article/details/130640392 注:随时更新 JVM内存结构 内存结构 Java虚拟机在运行程序时会把其自动管理的内存划分为以上几个区域,每个区域都有的用途以及创建销毁的时机&#xf…

【JavaScript】手写Promise

🐱 个人主页:不叫猫先生 🙋‍♂️ 作者简介:2022年度博客之星前端领域TOP 2,前端领域优质作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! &am…

五. AMS实践,Hook启动未注册的Activity

Activity任务栈解析 正常情况下我们的app中的所有Activity都是运行在同一个任务栈(ActivityStack)里面的,也就是我们app的build.gradle文件中的applicationId那个任务栈. 如何实现Activity运行在不同的任务栈呢? 需要在Intent启动这个Activity的时候,给这个intent赋值,设置代…