STL源码剖析--重新填充refill()及内存池

重新填充free lists

当我们在allocate()分配内存时,如果free list中没有可用的区块,我们调用了_S_refill(),准备为free list重新填充空间,新的空间将取自内存池(由chunk_alloc()完成),缺省取得20个新的节点,但万一内存池空间不足,获得的节点数可能小于20。

//返回一个大小为n的对象,并且有时候会为适当的free list增加节点
//假设n已经适当的上调至8的倍数
template <bool __threads, int __inst>
void*
__default_alloc_template<__threads, __inst>::_S_refill(size_t __n)
{
    int __nobjs = 20;
    //调用_S_chunk_alloc(),尝试取得__nobjs个区块作为free list 的新的节点
    //注意参数__nobjs为引用
    char* __chunk = _S_chunk_alloc(__n, __nobjs);
    _Obj* __STL_VOLATILE* __my_free_list;
    _Obj* __result;
    _Obj* __current_obj;
    _Obj* __next_obj;
    int __i;

    //如果只获得一个区块,这个区块就分配给调用者用,free list无新节点
    if (1 == __nobjs) return(__chunk);
    //否则准备调整free list,纳入新节点
    __my_free_list = _S_free_list + _S_freelist_index(__n);

    //在__chunk空间内建立free list
      __result = (_Obj*)__chunk; 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值