共计 933 个字符,预计需要花费 3 分钟才能阅读完成。
概述
- free_list 链表总计蕴含 [0 – 15] 16 个元素,其中每个元素别离对应一条子 单 链表 (embedded pointers 组织治理)
- 每条子链表别离对应治理多个内存块(内存块大小从 8 字节到 128 字节)。如,其中 free_list[0] 治理 8 字节链表,之后子链表治理的空间大小顺次减少 8 字节
- 当使用者申请内存空间不是 8 的整数倍时,大小会被调整为 8 的整数倍再用对应的子链表进行治理
- 当使用者申请内存大于 128 字节时,调用 malloc 进行治理内存调配(malloc 意味着 cookie)
示例详解
第一次申请
- 客户申请 30 字节空间,std::alloc 调整 8 字节对齐到 32 字节,对应 free_list[3] 子链表
-
free_list[3] 为空,未指向可用内存块节点,调用 malloc 进行大的内存块申请(蕴含 cookie)
- malloc 申请时失去的内存空间:20 x 32 字节内存块 + 20 x 32 字节备用内存块(20 数量内存块可能为经验值,由 embedded pointers 组织成单链表)
- 将申请失去的第一个小内存块交给客户进行应用
第二次申请
- 客户申请 72 字节空间,atd::alloc 在 free_list[3] 中找到前次申请的 20 x 32 字节备用空间可用,此空间被从新 72 字节宰割,将第一块传给客户应用
第三次申请
- 客户申请 96 字节空间,std::alloc 查看 free_list 无备用内存可用,于是为 free_list[11] 子链表调用 malloc 进行大的内存块申请【20 x 96 + 20 x 96(对应图中 memory pool)】,将第一块内存块传给客户应用
内存回收
- 依据回收的内存大小,从新挂载到对应的子链表上 (embedded pointers 组织治理)
embedded pointers
下图对应上图某一子链表
union obj {
union obj *free_list_link;
char client_data[1]; // 源码中并未应用 client_data,可疏忽了解
}
- 嵌入式指针,借用内存块前 4 个字节治理可用内存造成单链表【无需占用额定空间,间接阐明 obj 必须 ≥ 4 字节(地址宽度)以用来被指针借用】
- 容器每次动态分配失去的是一个指针,并不知道此内存是否都带有 cookie(即外部的内存治理形式并不影响客户的应用)
正文完