STL空间配置器
10 分钟阅读
•
1016 字
+
802 词
空间配置器的基本原理
- 第一级配置器 直接使用 malloc和free ;
- 第二级配置器则视情况采 用不同的策略:
- ①当配置区块 大于128bytes ,将其视作足够大,便 调用第一级配置器,使用malloc和free ;
- ②==当配置区块 小于128bytes ,将其视作过小,为降低额外负担,便采用 内存池 的管理方式==
解释
:内存池的思想:一次向heap申请一块很大的内存(
内存池
),如果申请小块内存的话就直接到内存池中去要。这样的话,就能够有效的解决上面所提到的问题。
注意
:==如果用户申请的内存大小不是8的倍数,二级配置器会将申请的字节数上调至距离用户申请大小的最近的8的倍数处==。(这里带来了内部碎片问题,和之前谈到的外部碎片问题相比,这个问题我们无法避免)
问题:
内存块为什么必须要以8位单位呢,把1作为单位不就可以避免这个问题了吗?
——我们的内存块是像链表一样连接起来的,这样就必然需要指针来维护, 32位平台下指针4字节,64位平台下指针8字节,所以内存块最小也要能存放一个指针吧,这样就清楚了为什么是8字节。
二级配置器是以内存池管理的,每次从系统中配置一大块内存,并维护与之对应的自由链表
free-list
-
如果用户申请内存,有相同大小的需要就直接从
free-list中分配。 -
如果用户归还内存时,将根据归还内存快的大小,将需要归还的内存插入到对应
free-list的最顶端。
- free_list列表中没有空余,内存池也不够。 调用malloc重新分配内存,分配时会多分配一倍的内存 ,把相应的内存挂到free_list下,剩余的放到内存池中。
- free_list列表中没有空余,内存池也不够,malloc也失败 。则调用一级空间配置器,里面会有循环处理,或者抛出异常。