跟着卷卷龙一起学 Camera-- 内存池浅析 04
内存池的实现
在内存池实现的环节,我们需要构建两个类,一个是 MemoryBlock 类,用于管理内存块链表,其成员变量包括内存块大小,内存块剩余大小,First 代表当前内存块可以使用的第一个序号,Next 则是当前可分配单元指向的下一个可分配单元,data 则是位置指针。一个是 MemoryPool 类,用于管理内存池,开出了 alloc 和 free 的操作接口,其成员变量包括内存池初始大小,增长大小,分配单元大小,和内存块链表。
首次生成 MemoryBlock,会 new 出来一个 MemoryBlock 类,并带参数初始化。然后找到符合条件的内存块。如果找到了,则进行分配固定大小,在 MemoryPool 的 Alloc()中,遍历 block 链表,找到 nFree 大于 0 的 block,从其上分配内存单元。然后将 nFree 减一,修改 nFirst 的值,修改可用单元的大小。如果没找到则说明原来的内存块都满了,需要再次分配。
在 MemoryPool 的 Free(pFree)函数中,根据 pFree 的值,找到它所在的内存块,然后将它的序号作为 nFirst 的值(因为它绝对是空闲的),在 pFree 的头两个字节中写入原来 nFirst 的值。然后要判断,该 block 是否全部为 free,方法是检测 nFree * nUnitSize == nSize。若是,则向系统释放内存,若不是,则将该 block 放到链表的头部,因为该 block 上一定含有空隙的内存单元,这样可以减少分配时遍历链表所消耗的时间。
版权声明: 本文为 InfoQ 作者【卷卷龙】的原创文章。
原文链接:【http://xie.infoq.cn/article/bd382f82b4457e4d964b83c04】。文章转载请联系作者。
评论