std::alloc 分两级层进行内存管理,第一级在接下来的学习中是次要的,主要内容都集中在第二级里。在 G4.9 版本中,第一级已被删除
补充说明
class semple_alloc
:应用层内存分配的基本单位是元素个数[ n] ,但底层实现中二级分配的单位是字节,此处便完成元素个数到字节数的转换[ n * sizeof(T) ]补充说明
图片中仅保留了内存分配中最原汁原味的部分,其它内容已被剔除方便学习cookie
bool threads, int inst
仅保留接口,实现中已剔除ROUND_UP : 将参数值“上调”整为 8 的倍数(计算内存申请追加量会使用) union obj *free_list_link : 嵌入式指针,链接可用内存块 volatile : 多线程时使用,此处可暂忽略 free_list[_NFREELISTS] : 包含 16 个元素,每一个元素都是指针,指向自由链表 FREELIST_INDEX : 根据所用内存大小计算对应自由链表下标值(“上调”到8的倍数对应的下标值) refill : 当自由链表为空时调用 start_free、end_free : 指向战备池 heap_size : 分配累计总量(关系到追加量)
补充说明
if (n > (size_t)__MAX_BYTES) : 超过 128 字节时使用一级内存管理(malloc、free)
for(i=1; ;++i) : 循环从 1 开始,由于第 0 个内存块返回给了客户使用
补充说明
start_free = (char*)malloc(bytes_to_get) == 前一章模拟内存不足时的状况就是改动的此处 ==> start_free = (bytes_to_get + heap_size > 10000) ? 0 : (char*)malloc(bytes_to_get);