关于c++:C内存管理10G29-stdalloc-源码刨析

40次阅读

共计 971 个字符,预计需要花费 3 分钟才能阅读完成。

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

G2.9 中的一级内存治理

补充阐明

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

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

片段一

补充阐明

  • 图片中仅保留了内存调配中最原汁原味的局部,其它内容已被剔除不便学习

    • 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 : 调配累计总量(关系到追加量)

片段二

补充阐明

  • deallocate:当内存块小于 128 字节时,内存再无奈归还给操作系统(free),自在链表将增长至顶峰
  • 内存偿还难以实现:存在多条自在连链表且链表可能会很长,链表中的内存块通过调配、偿还,已无奈高效的去判断链表中的哪些内存块是地址上是间断的(cookie)
  • 此种实现不算内存泄露,或者称之为”王道“。会影响多任务零碎中的其它过程
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);

片段四

正文完
 0