您的位置:首页 >C++实现简单内存池性能优化技巧
发布于2026-01-29 阅读(0)
扫一扫,手机访问
C++固定大小内存池通过预分配连续内存块并用自由链表管理空闲块,实现O(1)分配/释放;需注意对齐、链表初始化及线程安全。

用C++实现一个简单的内存池,核心是预先分配一大块连续内存,避免频繁调用new/delete或malloc/free带来的系统开销和碎片问题。它适合对象大小固定、生命周期短且高频创建/销毁的场景(比如游戏中的粒子、网络包缓冲区)。
最实用的入门方案是“单块固定尺寸”内存池:所有分配的内存块大小一致,管理简单、无碎片、速度极快。
std::vector或new char[n])alignof(std::max_align_t)或目标类型的对齐要求(可用std::align辅助)以下是一个轻量、无依赖的模板实现片段(省略异常处理和线程安全):
template <size_t BlockSize, size_t BlockCount = 1024>
class SimpleMemoryPool {
alignas(BlockSize) char buffer[BlockSize * BlockCount];
std::byte* free_list = nullptr;
public:
SimpleMemoryPool() {
// 构建初始空闲链表:每个块头存下一个块地址
for (size_t i = 0; i < BlockCount - 1; ++i) {
auto block = buffer + i BlockSize;
*reinterpret_cast<std::byte*>(block) = block + BlockSize;
}
free_list = buffer;
reinterpret_cast<std::byte*>(buffer + (BlockCount - 1) BlockSize) = nullptr;
}
void* allocate() {
if (!free_list) return nullptr;
void* ptr = free_list;
free_list = *reinterpret_cast<std::byte**>(free_list);
return ptr;
}
void deallocate(void* ptr) {
if (!ptr) return;
*reinterpret_cast<std::byte**>(ptr) = free_list;
free_list = static_cast<std::byte*>(ptr);
}
};
使用时:SimpleMemoryPool<64> pool; → 分配64字节块,最多1024个。
operator new和delete让类直接使用该池,可重载其成员函数:
struct Particle {
float x, y, life;
static SimpleMemoryPool<sizeof(Particle)> pool;
void* operator new(size_t) { return pool.allocate(); }
void operator delete(void* p) { pool.deallocate(p); }
};
这样new Particle就走池子,delete p也自动归还,对业务代码透明。
这个简单池不处理多线程竞争,也不支持变长分配。实际项目中需考虑:
std::mutex)或用无锁链表(atomic操作)支持并发不复杂但容易忽略对齐和链表初始化细节,写完建议用ASan或Valgrind验证内存行为。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9