STL空间配置器

STL六大组件及关系:
STL空间配置器_第1张图片

图片来源:博览网

  1. 空间配置器:内存池实现小块内存分配,对应到设计模式–单例模式(工具类,提供服务,一个程序只需要一个空间配置器即可),享元模式(小块内存统一由内存池进行管理)
  2. 迭代器:迭代器模式,模板方法
  3. 容器:STL的核心之一,其他组件围绕容器进行工作:迭代器提供访问方式,空间配置器提供容器内存分配,算法对容器中数据进行处理,仿函数伪算法提供具体的策略,类型萃取  实现对自定义类型内部类型提取。保证算法覆盖性。其中涉及到的设计模式:组合模式(树形结构),门面模式(外部接口提供),适配器模式(stack,queue通过deque适配得  到),建造者模式(不同类型树的建立过程)。
  4. 算法:
  5. 仿函数:一种类似于函数指针的可回调机制,用于算法中的决策处理。涉及:策略模式,模板方法。
  6. 适配器:STL中的stack,queue通过双端队列deque适配实现,map,set通过RB-Tree适配实现。涉及适配器模式。(类型萃取):基于范型编程的内部类型解析,通过typename获取。可以获取迭代器内部类型value_type,Poter,Reference等

STL空间配置器产生的缘由:
前提:申请内存及其释放产生的问题
(1)内存碎片问题。(外部碎片)
(2)一直在因为小块内存而进行内存申请,调用malloc,系统调用产生性能问题。
注:内碎片:因为内存对齐/访问效率(CPU取址次数)而产生如用户需要3字节,实际得到4或者8字节的问题,其中的碎片是浪费掉的。
外碎片:系统中内存总量足够,但是不连续,所以无法分配给用户使用而产生的浪费。(关于内外碎片详情查看操作系统原理)。
STL空间配置器的实现细节
实现策略:
用户申请空间大于128?
yes:调用一级空间配置器
no:调用二级空间配置器
大致实现为:
二级空间配置由内存池以及伙伴系统:自由链表组成
一级空间配置器直接封装malloc,free进行处理,增加了C++中的set_handler机制(这里其实也就是个略显牵强的装饰/适配模式了),增加内存分配时客户端可选处理机制
可配置性:
客户端可以通过宏__USE_MALLOC进行自定义选择是否使用二级空间配置器。
关于二级空间配置器:
二级空间配置器维护一个内存池(由malloc得到)一个自由链表桶(类似于hash桶)每个桶里一个自由链表(节点保存小块内存碎片)。
基本过程:
用户申请空间—>检查自由链表中是否有空闲节点?—>
是:取走返回,Allocate()
否:自由链表向内存池申请内存,内存池空间是否有空间?—>
是:取内存连接到链表,返回给一个用户
否:malloc补充内存池,逐级返回malloc

你可能感兴趣的:(原创)