根据区块大小,决定使用第 n 号 free-list。
n 从 1 起算。
static size_t FREELIST_INDEXsize_t bytes return bytes __ALIGN-1/__ALIGN - 1 // 传回一个大小为 n 的对象,并可能加入大小为 n 的其它区块到 free list. static void refillsize_t n// 配置一大块空间,可容纳 nobjs 个大小为 quotsizequot 的区块。
// 如果配置 nobjs 个区块有所不便,nobjs 可能会降低。
static char chunk_allocsize_t size int ampnobjs // Chunk allocation state. static char start_free//内存池起始位置。
只在 chunk_alloc中变化 static char end_free//内存池结束位置。
只在 chunk_alloc中变化 static size_t heap_sizepublic: static void allocatesize_t n / 详述于后 / static void deallocatevoid p size_t n / 详述于后 / static void reallocatevoid p size_t old_sz size_t new_sz//以下是 static data member 的定义与初值设定template ltbool threads int instgtchar __default_alloc_templateltthreads instgt::start_free 0 template ltbool threads int instgt char __default_alloc_templateltthreads instgt::end_free 0 template ltbool threads int instgt size_t__default_alloc_templateltthreads instgt::heap_size 0 template ltbool threads int instgt __default_alloc_templateltthreads instgt::obj volatile __default_alloc_templateltthreads instgt::free_list__NFREELISTS 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2.2.7 空间分配函数 allocate 此函数首先判断区块大小,大于 128 bytes 就调用第一级配置器,小于 128 bytes 就检查对应的 free list。
如果 free list 之内有可用的区块,就直接拿来用,如果没有可用区块,就将区块大小上调至 8 倍数边界,然后调用 refill,准备为 free list 重新填充空间。
refill将于稍后介绍。
Allocate的算法描述: 算法:allocate 输入:申请内存的大小 size 输出:若分配成功,则返回一个内存的地址,否则返回 NULL ifsize 大于 128) 启动第一级分配器直接调用 malloc 分配所需的内存并返回内存地址; else 将 size 向上 round up 成 8 的倍数并根据大小从 free_list 中取对应的表头 free_list_head iffree_list_head 不为空) 从该列表中取下第一个空闲块并调整 free_list; 返回 free_list_head else 调用 refill 算法建立空闲块列表并返回所需的内存地址; Allocate的代码实现: // n must be gt 0 static void allocatesize_t n obj volatile my_free_list obj result // 大于 128 就呼叫第一级配置器 If n gt size_t __MAX_BYTES returnmalloc_alloc::allocaten // 寻找 16 个 free lists 中适当的一个 my_free_list free_list FREELIST_INDEXn result my_free_list if result 0 // 没找到可用的 free list,准备重新填充 free list void r refillROUND_UPn return r // 调整 free list my_free_list result -gt free_list_link return result 区块子 free_list 中拔出,示意图如下:2.2.8 空间释放函数 deallocate 此函数首先判断区块大小,大于 128 bytes 就呼叫第一级配置器,小于 128 bytes 就找出对应的 free list,将区块回收。
Deallocate算法描述: 算法:deallocate 输入:需要释放的内存块地址 p 和大小 size ifsize 大于 128 字节)直接调用 fre.
上一篇:
各种指标源码
下一篇:
哈弗F7 VS名爵HS,谁更懂得年轻人的心?