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 内存分配)概述

STL源代码分析(ch2 内存分配)uninitialized_fill

STL源代码分析(ch2 内存分配)jjalloc.h

STL源代码分析(ch2 内存分配)uninitialized_fill

STL源代码分析(ch2 内存分配)uninitialized_fill_n

STL内存管理器的分配策略