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