【C++内存管理】10_G2.9 std::alloc 源码刨析

std::alloc 分两级层进行内存管理,第一级在接下来的学习中是次要的,主要内容都集中在第二级里。在 G4.9 版本中,第一级已被删除

G2.9 中的一级内存管理

image.png

image.png

image.png

补充说明
  • class semple_alloc :应用层内存分配的基本单位是元素个数[ n] ,但底层实现中二级分配的单位是字节,此处便完成元素个数到字节数的转换[ n * sizeof(T) ]

G2.9 中的二级内存管理【重点】

片断一

image.png

补充说明
  • 图片中仅保留了内存分配中最原汁原味的部分,其它内容已被剔除方便学习cookie

    • bool threads, int inst 仅保留接口,实现中已剔除
  • 实现中所有的成员函数和成员变量都是静态的,所以很是容易扩展为 C 版本
ROUND_UP : 将参数值“上调”整为 8 的倍数(计算内存申请追加量会使用)

union obj *free_list_link : 嵌入式指针,链接可用内存块

volatile : 多线程时使用,此处可暂忽略

free_list[_NFREELISTS] : 包含 16 个元素,每一个元素都是指针,指向自由链表

FREELIST_INDEX : 根据所用内存大小计算对应自由链表下标值(“上调”到8的倍数对应的下标值)

refill : 当自由链表为空时调用

start_free、end_free : 指向战备池

heap_size : 分配累计总量(关系到追加量)

片断二

image.png

image.png

image.png

补充说明
  • deallocate :当内存块小于 128 字节时,内存再没法归还给操做系统(free),自由链表将增加至高峰
  • 内存归还难以实现:存在多条自由连链表且链表可能会很长,链表中的内存块通过分配、归还,已没法高效的去判断链表中的哪些内存块是地址上是连续的(cookie)
  • 此种实现不算内存泄露,或许称之为”霸道“。会影响多任务系统中的其它进程
if (n > (size_t)__MAX_BYTES) : 超过 128 字节时使用一级内存管理(malloc、free)

片断三

image.png

for(i=1; ;++i) : 循环从 1 开始,由于第 0 个内存块返回给了客户使用

片断三

image.png

image.png

补充说明
  • 内存的补充永远是补充到战备池
start_free = (char*)malloc(bytes_to_get)
 
== 前一章模拟内存不足时的状况就是改动的此处 ==>

start_free = (bytes_to_get + heap_size > 10000) ? 0 : (char*)malloc(bytes_to_get);

片断四

image.png

相关文章
相关标签/搜索