STL初探——__default_alloc_template的空间配置allocate()和空间释放deallocate()

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;
    }
}

posted @ 2017-05-04 21:21  Forever-Road  阅读(442)  评论(0编辑  收藏  举报