SGI STL第二级空间配置器__default_alloc_template的chunk_alloc函数

本文探讨了SGI STL中二级空间配置器的工作原理,特别是针对小于128 bytes内存分配的精细管理。二级空间配置器维护内存池,并通过free_list数组管理,以提高效率。当free_list无法提供合适内存时,会调用refill和_S_chunk_alloc进行内存块分配。文章详细解释了allocate、refill和_S_chunk_alloc的交互过程。
摘要由CSDN通过智能技术生成

         SGISTL默认使用二级空间配置器,当需要配置的区块大于128 bytes时SGI STL调用一级空间配置器,一级空间配置器的allocate函数直接使用malloc分配内存,deallocate函数直接使用free释放内存。当需要配置的区块小于128 bytes时SGI STL调用二级空间配置器。

         相比于一级空间配置器简单粗暴的内存使用方法,二级空间配置器对内存的使用显得精细很多。

         二级空间配置器的具体用法请看书,我就不抄书了,只对二级空间配置器中容易糊涂的地方写一下我的理解。

内存池和free_list到底什么关系?

二级空间配置器维护了一个内存池,有一个名为free_list的数组负责管理内存池。free_list的每个元素构成一个链表,同一个链表的每个元素指向的内存大小相同,free_list的所有链表节点指向的内存大小 <= 内存池。

之所以使用数组而不是链表,我猜测有两个原因:1. 二级空间配置器把内存池分为固定的16个大小等级,即free_list的长度(16)是固定的;2.既然free_list的长度固定那么采用数组无疑是时间效率更高的方法(O(1)),如果采用链表,free_list的查询效率为O(n)。

 

一下是我理解的二级空间配置器执行过程,时间关系,不画程序流程图了。

1.             二级空间配置器在索要内存时调用allocate函数,如果索要的内存大于128字节,调用一级空间配置器,否则allocate查free_list数组,从free_list中某个元素指向的链表中取出一块内存后返回。

 

2.             当free_l

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值