2.3 KiB
2.3 KiB
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 |
当前已分配块数 |
使用示例
// 创建一个能分配 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 - 分配器接口
- LinearAllocator - 线性分配器
- ProxyAllocator - 代理分配器