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

2.3 KiB
Raw Blame 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 当前已分配块数

使用示例

// 创建一个能分配 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)) {
    // ...
}

相关文档