c++STL 一级、二级空间配置器

空间配置器概念

空间配置器是操作系统开辟的一大段内存空间。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的整数倍,就造成了内碎片问题

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值