STL提供了六大组件,彼此可以组合套用
容器:就是各种数据结构 eg:vector 、list、deque等等
算法:各种常用的算法 eg: sort 、swap等等
迭代器:所有的STL容器都附带有自己专属的迭代器;并且原生指针也是一种迭代器
仿函数:行为类似函数;从实现的角度看,仿函数是一个重载了operator()的类或者类模板
配接器:一种用来修饰容器或仿函数或迭代器接口的东西 eg:queue、stack
空间配置器:负责空间配置与管理。从实现角度来看,配置器是一个实现了动态空间配置,空间管理、空间释放的类模板。
从上面的六大组件之中,我们还可以了解到两种设计模式:适配器模式和迭代器模式
空间配置器:
空间配置器是一个双层配置器,考虑到了小型区块所可能造成的内存破碎问题。
当配置区块超过128字节时,认为“所需空间足够大”,便调用第一级配置器。当配置区块小于128字节时,认为"过小",就调用用第二级配置器。
第一级配置器:封装了malloc和free,(并且模拟C++的set_new_handler()以处理内存不足的情况)空间不足等异常处理机制
第二级配置器:维护了16种自由链表,负责16种小型区块的次配置能力(内存池);
内存不足,或者需要空间大于128字节时,就会去调用第一级配置器;
第二级配置器,是以内存池管理的:每一次配置一大块内存,并维护对应的自由链表。下次若再有相同大小的空间需求的时候,直接从自由链表中取;如果取出的内存不在使用,则又由配置器归还给自由链表。
这样,可以解决频繁向系统申请小块内存造成的低效率,以及内存碎片的问题。
自由链表类似于哈希桶的结构,当我们需要一块8字节的空间时,只需要从对应的自由链表下,去取下一个对应的节点;但是我们如果不取如下图所示的字节的时候,例如我们需要50字节;这个时候,为了方便管理,第二配置器会主动将任何小额区块的内存需求量上调至8的倍数。也就是我们申请50字节的时候,会去自由链表56字节的位置取节点。