1.什么是空间配置器
空间配置器,顾名思义就是为各个容器高效的管理空间(空间的申请与回收),在默默地工作。虽然在常规使用STL时,可能用不到它,但站在学习研究的角度,学习它的实现原理对我们有很大的帮助。
2.为什么需要空间配置器
前面在模拟实现vector、list、map、unordered_map等容器时,所有需要空间的地方都是通过new申请的,虽然代码可以正常运行,但是有以下不足之处:空间申请与释放需要用户自己管理,容易造成内存泄漏 频繁向系统申请小块内存块,容易造成内存碎片 频繁向系统申请小块内存,影响程序运行效率 直接使用malloc与new进行申请,每块空间前有额外空间浪费(因为每块空间都要开额外的内存空间记录这块空间的大小) 申请空间失败怎么应对 代码结构比较混乱,代码复用率不高 未考虑线程安全问题因此需要设计一块高效的内存管理机制。
3.SGI-STL空间配置器实现原理
在windows和Linux下都有直接向堆申请空间的接口,windows下接口为VirtualAlloc,Linux下接口为brk。malloc是封装了irtualAlloc和brk在VirtualAlloc和brk之上,malloc本身其实也是一个内存池,该内存池是面向整个程序的。空间配置器对malloc进行封装 ,其是在malloc之上针对STL容器来设计的,空间配置器是一个内存池,该内存池仅面向STL的容器。
第二节中提到的几点不足之处,最主要还是:频繁向系统申请小块内存造成的。那什么才算是小块内存?SGI-STL以128字节作为小块内存与大块内存的分界线,将空间配置器其分为两级结构,一级空间配置器处理大块内存,二级空间配置器处理小块内存。