定长内存池设计
一、模型搭建
由于每次都是申请固定大小的内存,所以特点:性能达到极致,不考虑内存碎片
还有一个 size_t _remain 记录大空间的剩余字节,如果不够了要及时向系统申请资源。
二、开辟空间 T* New()
1、实现思路
如果自由链表里面有内存块,就优先使用自由链表里面的内存(头删即可)
如果自由链表里面没有内存块再去大空间里面申请内存。如果剩余空间不够就向操作系统申请内存。
注意我们至少要存储4/8字节的下一个内存块地址,所以如果申请的类型 T 大小不足4/8就要开成4/8字节大小。
最后定位 new,显示调用构造函数并返回 obj
2、主要操作
(1)如何获取一个地址大小的内存?
我们知道在 32 位和 64 位下地址大小分别是 4 和 8,所以办法就是把内存强转成 *(void**),二级指针解引用后是一级指针,这样就自动判断了指针的大小
(2)如何头删自由链表?
先存自由链表的下一个内存的地址:void* next = *(void**)_freeList;
再获取固定大小的内存块:T* obj = (T*)_freeList;
最后头指针指向存放的下一个内存地址:_freeList = next;
(3)如何向操作系统申请空间?
可以用 windows 专用的函数 VirtualAlloc
参数介绍:
具体使用:
(4)如何使用定位 new?
new(obj)T;
三、释放空间 void Delete(T* obj)
1、实现思路
显示调用析构函数清空内存数据。
头插链入自由链表。
2、主要操作
如何头插自由链表?
先在 obj 中保存下一个内存块地址:*(void**)obj = _freeList;
obj 作为链表头部:_freeList = obj;