1、第二级配置器的空间配置函数:allocate()
__default_alloc_template 拥有配置器的标准接口函数 allocate(),毫无疑问,该函数首先得判断区块大小,大于128bytes就是用第一级配置器,小于或者等于128bytes 就检查对应的free-list,如果 free-list 之内有可用的块,则直接拿来用,否则就将区块上调边界到8的倍数,然后调用 refill(),准备为free-list重新填充空间。
static void* allocate(size_t __n) { void* __ret = 0; //大于 128byte,调用第一级配置器 if (__n > (size_t) _MAX_BYTES) { __ret = malloc_alloc::allocate(__n); } else { //寻找16个free lists中最适当的一个 _Obj* __STL_VOLATILE* __my_free_list = _S_free_list + _S_freelist_index(__n); _Obj* __RESTRICT __result = *__my_free_list; //没找到可用的free-list,重新填充 if (__result == 0) { __ret = _S_refill(_S_round_up(__n)); } else { //调整free-list *__my_free_list = __result -> _M_free_list_link; __ret = __result; } }
return __ret; }
2、第二级配置器的空间释放函数:deallocate()
同理,该函数首先需要判断区块的大小,大于128bytes就调用第一级配置器,小于或者等于128bytes就找出对应的 free-list,将区块回收:
/* __p may not be 0 */ static void deallocate(void* __p, size_t __n) { //大于128bytes就调用第一级配置器 if (__n > (size_t) _MAX_BYTES) malloc_alloc::deallocate(__p, __n); else { //寻找对应的free-list _Obj* __STL_VOLATILE* __my_free_list = _S_free_list + _S_freelist_index(__n); _Obj* __q = (_Obj*)__p; //调整free-list,回收区块 __q -> _M_free_list_link = *__my_free_list; *__my_free_list = __q; } }