给出源码,功能和解读已经在注释中。
static void* allocate(size_t __n) // __n为用户想要开辟的内存大小
{
void* __ret = 0;
if (__n > (size_t) _MAX_BYTES) { // 大于128字节就不用内存池 通过一级配置器一样
__ret = malloc_alloc::allocate(__n);
}
else { // 小于128字节,使用二级配置器
_Obj* __STL_VOLATILE* __my_free_list // 二级指针, 指向要分配的大小合适(n向上取8的倍数)的链表
= _S_free_list + _S_freelist_index(__n);
// Acquire the lock here with a constructor call.
// This ensures that it is released in exit or during stack
// unwinding.
# ifndef _NOTHREADS
/*REFERENCED*/
_Lock __lock_instance; // 面向对象的加锁解锁方式,以下为临界区
# endif
_Obj* __RESTRICT __result = *__my_free_list; // result指向链表
if (__result == 0) // 链表为空
__ret = _S_refill(_S_round_up(__n)); // 分配块大小为 n向上取8 的一个链表
else {
*__my_free_list = __result -> _M_free_list_link; // 数组中的头结点指向链表的第二个节点
__ret = __result; // 链表的原第一个节点分配出去
}
}
return __ret;
};
简单画图: