这里只讲了二级空间配置器,更多关于STL空间配置器的设计,可以参考博客:http://blog.csdn.net/hackbuteer1/article/details/7724534

举个例子来说明二级控件配置器的设计过程(1-6流程):

1、申请一块7字节的内存

  对齐到8字节倍数,向系统申请8字节的内存(<128字节),由内存池管理。申请内存时发现没有对应的自由链表,向内存池申请8*20字节形成0号自由链表,此时内存池中没有分配到内存,那么系统会向内存中取出一大块内存(大小为8字节*20*2),其中8字节*20分配给0号自由链表,将自由链表的第一个区块分配给客户端,剩下19个区块分配交由自由链表维护;另外的8字节*20留给内存池。

2、申请一块13字节的内存

  将13字节对齐到8字节倍数,向系统申请16字节的内存(<128字节),由内存池管理。发现没有对应的自由链表,向内存池申请16*20字节,形成自由链表。但经过步骤1后内存池中只剩下8*20=160字节,只能提供160/16=10个区块,线程池将池中现有的内存分配给该该自由链表。也就是说,此时1号自由链表只有10个区块,其中第一个区块分配给客户端,剩余的9个区块由自由链表维护。

3、申请一块17字节的内存

  将17字节对齐到24字节,向系统申请24字节的内存(<128字节),有内存池管理。发现没有对应的自由链表,向内存池申请24*20字节,形成自由链表。但经过步骤2后,内存池中已无剩余内存,需要向系统申请。若系统剩余内存,那么同步骤1类似,分配一大块内存,一部分形成自由链表,另一部分由内存池管理。但如果系统此时没有多余内存分配给内存池,那么,就会遍历各个自由链表,将自由链表中还没有使用,并且够大的部分挖出去交给客户端;如果连自由链表中都没有内存了,说明此时内存真的分配不足,调用一级配置器的out-of-memory处理机制,可能会释放其它的内存拿来此时使用,否则的话就只能抛出bad_alloc异常了。

 

posted on 2015-05-12 22:09  HanEichy  阅读(277)  评论(0编辑  收藏  举报