空间配置器概念

空间配置器是操作系统开辟的一大段内存空间。STL需要扩容申请内存时,就从空间配置器中申请,不需要再经过操作系统。并且,它还能回收释放的空间,供下一次使用。一个进程中有一个空间配置器,进程中所有容器需要的空间都到对应空间配置器申请。进程终止,对应空间配置器空间释放。

优点

a、提高效率 b、避免内存碎片

空间配置器原理

空间配置器有两级结构,一级空间配置器是用来处理大块内存,二级空间配置器处理小块内存。SGI-STL规定以128字节作为小块内存和大块内存的分界线。
为什么这样区分成两级?
因为STL容器,一般申请的都会是小块的内存,二级空间配置器,主要是管理容器申请空间和释放的空间。
如果用户申请的空间直接大于的128字节直接找的是一级空间配置器申请空间。

一级空间配置器

一级空间配置器原理很简单,直接是对malloc和free进行了封装,并且增加了C++中的申请空间失败抛异常机制。
主要的作用是:向操作系统申请内存,申请失败会抛异常。
为什么不直接用C++的new和delete,因为这里并不需要调用构造函数和析构函数。

二级空间配置器

二级空间配置器专门负责处理小于128字节的小块内存。

SGI-STL采用了内存池的技术来提高申请空间的速度以及减少额外空间的浪费,采用哈希桶的方式来提高用户获取空间的速度和高效管理。

内存池技术

内存池就是,先申请一块较大的内存块做为备用,当需要内存时,直接从内存池中取内存,当内存池中内存不够时,使用一级空间配置器,向内存中申请大块空间。当用户不用申请的空间时,直接归还内存池。这样就避免了频繁向系统申请小块内存找出的效率低,内存碎片的问题。
当用户释放该空间时,并不知道这块空间应该放在内存池的什么位置,在STL配置器中,使用哈希桶的技术来解决这一问题。

哈希桶技术

为什么不用链表来管理归还的空间?
因为用户申请空间,查找合适的内存块时,效率低。
为什么向上对齐到了8字节的整数倍?
我们的内存块是像链表一样连接起来的,这样就必然需要指针来维护, 32位平台下指针4字节,64位平台下指针8字节,所以内存块最小也要能存放一个指针。但是这样造成了内存碎片问题
大致流程:
容器进行扩容,如果申请的空间是大于128字节,直接向一级空间配置器申请。如果小于128字节,先查找哈希桶对应大小位置是否为空,不为空,直接从该位置申请空间,如果该位置为空,向内存池申请。当内存池空间不够了会直接向OS申请一大块空间

内存碎片问题

外碎片问题:

由于频繁申请小块内存,导致被申请的内存块不连续,如果下一次需要申请一大块内存,内存空间够,但是由于不连续,导致申请不出来。
内核针对大量申请在堆上小块内存导致碎片化的问题,是用来slab分配器来解决。结构类似二级空间配置器的哈希结构

内碎片问题:

内碎片问题:给的内存数比实际要的内存数多,导致空间浪费。二级配置器切割内存块向上对齐8的整数倍,就造成了内碎片问题

c++STL 一级、二级空间配置器相关推荐

  1. STL——空间配置器剖析(一级空间配置器、二级空间配置器的本质及运用场合,是如何用内存池去管理的)

    一级空间配置器.二级空间配置器的本质及运用场合,是如何用内存池去管理的 研究了好久才写好的,主要是二级配置器,大标题小标题什么的可能没有安排好,先 写了原理上的内容,再剖析了各个函数源码,各个目录可以 ...

  2. 深度剖析SGI STL二级空间配置器内存池源码

    文章目录 一.SGI STL二级空间配置器重要成员解读 二. 二级空间配置器内存池的结构 三. 两个重要的函数 1. _S_round_up 2. _S_freelist_index 四. 内存池al ...

  3. 复习SGI STL二级空间配置器(内存池) | 笔记自用

    前言 在以前学习C++的时,写过一些剖析STL空间配置器的文章,如今回头再看一遍,想着复习一下. SGI STL空间配置器: [该目录中查看] SGI STL包含了一级空间配置器和二级空间配置器,其中 ...

  4. STL中的空间配置器

    STL中的空间配置器 文章目录 STL中的空间配置器 1. 什么是空间配置器 2. 为什么需要空间配置器 3. SGI-STL空间配置器实现原理 3.1 一级空间配置器 3.2 二级空间配置器 3.1 ...

  5. 详解STL中的空间配置器(SGI版本)

    空间配置器 1.什么是空间配置器 为各个容器高效的管理空间(空间的申请与回收)的 2.为什么需要空间配置器 各种容器----->可以存放元素---->底层需要空间 new 申请空间 ope ...

  6. 一篇文章搞懂STL中的空间配置器allocator(原创,多图,易懂)

    Table of Contents 0.引入 1.标准的空间配置器allocator 2.更为高效的空间配置器alloc 2.1----对象的构造与析构 2.1.1 对象的构造:::construct ...

  7. STL笔记(二)---空间配置器

    一.概述 allocator是STL的六大组件之一,空间配置器.其作用就是为各个容器管理内存(内存开辟 内存回收).allocator配置的对象不只是内存,它也可以向硬盘索取空间.使用STL库的时候不 ...

  8. malloc开辟的空间在哪一个区间_C++进阶系列之STL(2)SGI版本空间配置器

    1.STL中的空间配置器在STL中,空间配置器分了2组,分别为一级空间配置器和二级空间配置器,但是它们都有自己各自运用的场合:一般说来,一级空间配置器一般分配的空间大于128B,二级空间配置器的分配空 ...

  9. C++ STL : SGI-STL空间配置器源码剖析

    文章目录 空间配置器的概念 SGI-STL空间配置器 一级空间配置器 二级空间配置器 申请空间 补充内存块 从内存池中索要空间 空间回收 内存碎片 外碎片 内碎片 空间配置器的再次封装 空间配置器的概 ...

最新文章

  1. 英特尔成立物联网视频事业部,这届IESS还揭露了哪些信息?
  2. 按照指定字符(@split )分割字符串,并取第@index 个
  3. 终极JPA查询和技巧列表–第1部分
  4. Kubernetes 是如何调度的?
  5. 利用可视化软件navicat查看表的sql语句
  6. MyBatis 实践 -Mapper与DAO
  7. python计算器程序代码_7_python之路之python计算器
  8. PC值=当前程序执行位置+8
  9. 华为STP相关功能配置
  10. 无所不能,传感器黑科技层出不穷
  11. HTML5实例教程:拼图游戏-何韬-专题视频课程
  12. element遮罩_element-ui遮罩层el-dialog的使用
  13. (完美)华为nova2 PIC-AL00的USB调试模式在哪里打开的流程
  14. 标签平滑正则化(LSR)
  15. google 搜索十大搜索技巧和实用小技巧
  16. VMware vSphere核心组件
  17. 华南理工大学php,华南理工大学网络教育平台v3
  18. |app自动化测试之Appium问题分析及定位
  19. 软件开发好用的工具推荐
  20. JetBrains所有IDE和.NET 工具 V2022.1全面升级

热门文章

  1. RFC8402 Segment Routing Architecture 翻译
  2. 安装pandas成功但import不成功的解决办法
  3. 【JavaScript-9】Javascript中的布尔值和等式
  4. Excel的数据透视表怎么弄 ?数据透视表怎么做汇总求和
  5. 掌纹与掌静脉融合matlab代码,手形、掌纹和掌静脉多特征融合识别
  6. ROS 相关学习资源汇总
  7. vue 避免全局样式污染的正确做法
  8. 计算机应用基础第四版答案周南岳,计算机应用基础第周南岳win+office期末复习及答案.docx...
  9. 源码网站合集[细选过的][转贴]
  10. nx显示服务器,如何从Windows的命令行访问NX服务器?