STL源代码分析(ch2 内存分配)分配策略
Posted thefist11
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL源代码分析(ch2 内存分配)分配策略相关的知识,希望对你有一定的参考价值。
1. 二级分配
双层配置器,第一层直接调用malloc()和free().
配置内存小于128bytes时,使用第二级配置器:第二级配置器将小于128bytes的区块使用内存池(memory pool)管理【又称层次配置(sub-allocation)】,即每次配置一大块内存,并维护对应的自由链表(free-list),当下次有相同的内存需求就从free-list拨出,释放小区块就回收至free-list
使用16个自由链表负责16种小型区块的次级配置能力。如果内存不足转一级配置器。
8 16 24 32 40 48 56 64 72 80 88 96 104 112 120 128
1.1 allocate分配内存
enum __ALIGN = 8; // 小型區塊的上調邊界,即每块是8的倍数
enum __MAX_BYTES = 128; // 小型區塊的上限,即最大块
//根据bytes大小选择合适的第n号free-lists,n从0开始算。
static size_t FREELIST_INDEX(size_t bytes)
return (((bytes) + __ALIGN-1)/__ALIGN - 1);
static void * allocate(size_t n)
obj * __VOLATILE * my_free_list;
obj * __RESTRICT result;
//若n>128则调用第一级配置器
if (n > (size_t) __MAX_BYTES)
return(malloc_alloc::allocate(n));
//在16个free-list中寻找合适的。
// 通过大小取得free-list数组下标,随后取得对应节点的指针
// 相当于free_list[FREELIST_INDEX(n)],存着一个未使用的内存块
my_free_list = free_list + FREELIST_INDEX(n);
result = *my_free_list;
if (result == 0)
//没找到可用的free-list,准备重新填充free-list
void *r = refill(ROUND_UP(n));
return r;
//调整free-list,将当前节点移除,并当做结果返回给用户使用
//free_list_link即链表下一块内存,替代存着之前合适的数组里
*my_free_list = result -> free_list_link;
return (result);
;
1.2. deallocate内存释放
/* p may not be 0 */
static void deallocate(void *p, size_t n)
obj *q = (obj *)p;
obj * __VOLATILE * my_free_list;
//大于128则调用第一级配置器
if (n > (size_t) __MAX_BYTES)
malloc_alloc::deallocate(p, n);
return;
//寻找对应的free-list
my_free_list = free_list + FREELIST_INDEX(n);
//调整free list 回收区块,使数组存这个内存块,且这个内存块指向之前数组内的内存块
q -> free_list_link = *my_free_list;
*my_free_list = q;
以上是关于STL源代码分析(ch2 内存分配)分配策略的主要内容,如果未能解决你的问题,请参考以下文章
STL源代码分析(ch2 内存分配)uninitialized_fill
STL源代码分析(ch2 内存分配)uninitialized_fill