Files
XCEngine/docs/api/XCEngine/Memory/PoolAllocator/PoolAllocator.md

63 lines
2.8 KiB
Markdown
Raw Normal View History

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)