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

76 lines
2.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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) - 代理分配器