STL之空间配置器

为什么需要空间配置器?

通过new申请的空间,虽然代码可以正常运行,但是有以下不足之处:

  1. 空间申请与释放需要用户自己管理,容易造成内存泄漏
  2. 频繁向系统申请小块内存块,容易造成内存碎片
  3. 频繁向系统申请小块内存,影响程序运行效率
  4. 直接使用malloc与new进行申请,每块空间前有额外空间浪费
  5. 申请空间失败怎么应对
  6. 代码结构比较混乱,代码复用率不高
  7. 未考虑线程安全问题
SGI-STL空间配置器实现原理

SGI-STL以128作为小块内存与大块内存的分界线,将空间配置器其分为两级结构,一级空间配置器处理大块内存,二级空间配置器处理小块内存。

一级空间配置器

  • 一级空间配置器原理非常简单,直接对malloc与free进行了封装。

二级空间配置器

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

内存池

  • 内存池就是:先申请一块比较大的内存块已做备用,当需要内存时,直接到内存池中去去,当池中空间不够时,再向内存中去取,当用户不用时,直接还回内存池即可。避免了频繁向系统申请小块内存所造成的效率低、内存碎片以及额外浪费的问题。

SGI-STL中二级空间配置器设计

  • SGI-STL中的二级空间配置器使用了内存池技术,但没有采用链表的方式对用户已经归还的空间进行管理(因为用户申请空间时在查找合适的小块内存时效率比较低),而是采用了哈希桶的方式进行管理。那是否需要128桶个空间来管理用户已经归还的内存块呢?答案是不需要,因为用户申请的空间基本都是4的整数倍,其他大小的空间几乎很少用到。因此:SGI-STL将用户申请的内存块向上对齐到了8的整数倍(而不是4)。
    在这里插入图片描述

1. SGI-STL二级空间配置器之空间申请

在这里插入图片描述
2. 填充内存块
在这里插入图片描述
3. 向内存池中索要空间
在这里插入图片描述
4. SGI-STL二级空间配置器之空间回收
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值