76 lines
2.3 KiB
Markdown
76 lines
2.3 KiB
Markdown
|
|
# 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) - 代理分配器
|