重新填充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;