zoukankan      html  css  js  c++  java
  • 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;
        }
    }

    既然选择了远方,便只顾风雨兼程
  • 相关阅读:
    1075: 聚餐人数统计
    1074: 百钱买百鸡
    1072: 青蛙爬井
    1073: 级数求和
    1071: 分解质因子
    1070: 小汽车的位置
    1068: 二进制数
    2019 牛客多校 第六场
    2019 牛客多校 第五场
    2019 牛客多校 第二场
  • 原文地址:https://www.cnblogs.com/Forever-Road/p/6809898.html
Copyright © 2011-2022 走看看