轻量内存池通过预分配连续内存并用自由链表管理固定大小对象,避免系统调用与碎片;支持多尺寸分组(slab)、线程局部池+无锁中央池、RAII集成及STL兼容分配器。
用C++实现一个轻量、可控的内存池,核心是预先分配一大块内存,避免频繁调用 new/delete 或 malloc/free,从而减少系统调用开销和内存碎片。它不追求通用性,而是针对固定大小对象(如节点、消息包)做极致优化。
适用于对象大小统一、生命周期集中管理的场景(比如链表节点、事件结构体)。关键思路:用数组模拟空闲链表,通过指针而非下标管理可用块。
malloc 一块连续内存,按对象大小切分成若干“槽位”alloc() 取头、更新指针;free(ptr) 将 ptr 插回链表头struct Node { int val; Node* next; };,大小为 16 字节(对齐后),可切分 1024 个槽位 → 总内存约 16KB真实项目中对象大小往往不唯一。可借鉴 Linux slab 分配器思想:按常用尺寸(如 16B/32B/64B/128B/256B/512B/1K/2K/4K)预设若干“池子”,每个池只管一种 size。
size class 表(静态数组),每个元素对应一个 MemoryPool 实例(T 是该档位代表类型,或用 void* + offset 模拟)多线程争抢同一内存池会成为瓶颈。推荐每线程私有池(thread-local pool)+ 中央后备池(central fallback)组合策略。
thread_local static Pool tlp; ,99% 分配直接走本地,零同步std::atomic 维护栈顶)std::shared_mutex 或读写锁——对高频分配场景仍是重开销内存池不该破坏 C++ 的资源管理习惯。可通过定制分配器(Allocator)接入 STL 容器,或封装智能指针语义。
allocate()/deallocate(),传给 std::vector>
operator new —— 影响范围不可控,调试困难make_unique_in_pool(pool) 工厂函数,返回 std::unique_ptr,析构时自动归还内存基本上就这些。一个实用的内存池不需要面面俱到,关键是根据你的热点对象尺寸、线程模型和生命周期特征做裁剪。比起堆上分配快 3~10 倍很常见,但前提是别把它当成黑盒——得清楚它在哪归还、是否线程安全、有没有隐式扩容。不复杂但容易忽略。