携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情
内存池的实现
在内存池实现的环节,我们需要构建两个类,一个是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上一定含有空隙的内存单元,这样可以减少分配时遍历链表所消耗的时间。