2.8 KiB
2.8 KiB
PoolAllocator
命名空间: XCEngine::Memory
类型: class
头文件: XCEngine/Memory/PoolAllocator.h
描述: 为固定尺寸对象提供 O(1) 弹出/归还的池分配器。
概述
PoolAllocator 预先申请一整块内存,然后把它切成固定尺寸的 block,通过空闲链表管理这些 block。它适合:
- 大量尺寸相同或尺寸上界稳定的小对象
- 频繁分配和释放、但不想承担通用堆分配碎片与额外元数据开销的场景
生命周期与所有权
- Constructor 一次性申请整个池。
- Allocate 从空闲链表弹出一个 block。
- Free 把 block 放回空闲链表头部。
- Destructor 在整个池销毁时一次性释放底层内存。
当前实现限制
- Reallocate 当前返回
nullptr。 Allocate忽略调用时传入的alignment参数,真正使用的是构造阶段保存的对齐设置。- 对齐逻辑当前只影响 block stride 计算,不保证底层池起始地址本身按该对齐值申请。
- 构造函数当前不校验
blockSize > 0、poolSize > 0,也不处理底层内存申请失败后的初始化路径。 - Free 不检查指针是否真的来自当前池,也不防止重复释放。
- Contains 当前只检查“是否落在池的地址范围内”,不检查是否对齐到 block 边界,也不检查块是否仍在分配状态。
GetPeakAllocated当前返回整个池的总容量,而不是历史峰值使用量。
线程语义
- 当前没有锁;需要外部同步。
公开方法
| 方法 | 说明 |
|---|---|
| Constructor | 构造固定块池分配器。 |
| Destructor | 销毁整个池。 |
| Allocate | 分配一个 block。 |
| Free | 归还一个 block。 |
| Reallocate | 重分配 block;当前返回 nullptr。 |
| Contains | 判断指针是否位于池地址范围内。 |
| GetBlockSize | 查询逻辑 block 大小。 |
| GetFreeBlockCount | 查询空闲 block 数。 |
| GetTotalBlockCount | 查询总 block 数。 |
| GetName | 查询分配器名称。 |
| GetTotalAllocated | 查询当前已用字节数。 |
| GetTotalFreed | 查询当前空闲字节数。 |
| GetPeakAllocated | 查询峰值分配量;当前返回总池容量。 |
| GetAllocationCount | 查询当前已分配 block 数。 |