Files
XCEngine/docs/api/memory/memory-pool-allocator.md

76 lines
2.3 KiB
Markdown
Raw Normal View History

# PoolAllocator
**命名空间**: `XCEngine::Memory`
**类型**: `class`
**描述**: 内存池分配器,为固定大小的对象提供高效分配,消除内存碎片。
## 概述
`PoolAllocator` 预分配一大块内存,并将其划分为等大小的内存块。它维护一个空闲块链表,分配时从链表中取出一块,释放时归还到链表。这使得分配和释放都是 O(1) 时间复杂度,非常适合需要频繁分配/释放同尺寸对象的场景(如对象池)。
## 公共方法
### 构造/析构
| 方法 | 描述 |
|------|------|
| `PoolAllocator(size_t blockSize, size_t poolSize, size_t alignment = 8)` | 构造函数 |
| `~PoolAllocator()` | 析构函数 |
### IAllocator 实现
| 方法 | 描述 |
|------|------|
| `void* Allocate(size_t size, size_t alignment = 0) override` | 分配一个内存块(忽略 size 参数) |
| `void Free(void* ptr) override` | 释放内存块 |
| `void* Reallocate(void* ptr, size_t newSize) override` | 不支持,返回 nullptr |
### 内存块管理
| 方法 | 描述 |
|------|------|
| `bool Contains(void* ptr) const` | 检查指针是否属于此池 |
| `size_t GetBlockSize() const` | 获取内存块大小 |
| `size_t GetFreeBlockCount() const` | 获取空闲块数量 |
| `size_t GetTotalBlockCount() const` | 获取总块数 |
### 统计
| 方法 | 描述 |
|------|------|
| `size_t GetTotalAllocated() const` | 已分配的字节数 |
| `size_t GetTotalFreed() const` | 空闲块占用的字节数 |
| `size_t GetPeakAllocated() const` | 总块数乘以块大小 |
| `size_t GetAllocationCount() const` | 当前已分配块数 |
## 使用示例
```cpp
// 创建一个能分配 100 个 64 字节块的内存池
PoolAllocator pool(sizeof(MyObject), 100, alignof(MyObject));
// 分配O(1)
void* block = pool.Allocate();
// 或者使用 Allocate(size) 但忽略 size
void* block2 = pool.Allocate(sizeof(MyObject));
// 检查空闲块
printf("Free blocks: %zu\n", pool.GetFreeBlockCount());
// 释放O(1)
pool.Free(block2);
// 检查指针是否属于此池
if (pool.Contains(block)) {
// ...
}
```
## 相关文档
- [IAllocator](./memory-allocator.md) - 分配器接口
- [LinearAllocator](./memory-linear-allocator.md) - 线性分配器
- [ProxyAllocator](./memory-proxy-allocator.md) - 代理分配器