空间配置器

为什么要有空间配置器?

  在大型项目中,我们有没有想过,对于一些动态开辟空间的场景,如果空间大小比较小,但是又频繁申请释放的场景,那么频繁的从堆上拿取又放回是否有优化的地方呢?

空间配置怎样解决问题

  空间配置器就是做这样的优化的,它思想就是能不能对于较小的空间申请请求,我们只把对这块空间的控制权转移,不需要了就返回控制权。

空间配置器结构

首先对于结构来说,配置空间器里分为一级空间配置器,和二级空间配置器。

一级空间配置器

它是用来处理申请较大空间的场景,其实就是对malloc和free的封装。

二级空间配置器 

  它的思想使用到了哈希桶,比如以每8个字节为单位设置16个桶,(范围就是[0,128]字节)。

我们需要每个桶上可能会挂这与之对应大小的内存块,我们需要申请多少字节大小的内存时就到这个哈希桶中找,如果找到了,然后暂时从哈希桶中移除,等到不用的时候就将其头插再回到这个哈希桶中。 这就是所谓的控制权转移,可以使效率提高很多。另外它是向上取整的。

  如果这个哈希桶中没有对应大小的内存块的话,就会从预先申请的大块内存中“切割”20块过来放到这个哈希桶中。

  总的来说空间适配器就是先申请一大块内存 放着,申请内存时先走二级适配器,判断是否是大内存的申请,是的话就再去一级适配器当中,不是的话就到哈希桶中找内存块。它对内存的申请与释放主要是控制权的转移。

空间配置器存在的问题

   空间配置器的优点就是效率高,但是它也存在一些问题:

1.内碎片:

  因为我们申请小内存块是向上取整的,比如我只想要28byte,但是它会给我们分配32byte,那么有4byte就浪费了

2.外碎片:

假设我们一开申请了1000次8byte和200次24byte,就是申请了很多小内存,那么当我们申请128byte的时候,前面的内存也用不上。

在STL中的空间配置器没有解决这个问题,更好的内存应该会解决这个问题。

3.我们申请的内存会还给系统吗?

会还,但是得到进程结束时才会还。因为我们申请的大块内存被切分成了许多部分,有些部分甚至还在使用,或者挂在桶里面,我们还给系统只能从首地址开始还,系统是不支持分开还的。

总之,STL中的空间配置器存在一定的缺陷,比如外碎片和空间释放问题没有解决,但是它的效率还是比malloc高的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值