内存池的主要作用,简单地说来,便是提高内存的使用效率。堆内存的申请与释放(new/delete 及 malloc/free),涉及复杂的内存分配算法,相比由简单CPU 指令支持的栈内存的申请与释放,则是慢上了数量级。另一方面,栈的大小是有限制的,在需要大量内存的操作时,堆的使用是必要的。当然,频繁地申请与释放堆内存,效率是很低的,这也就是内存池出现的原因。 类似 std::vector 容器,在向 vector 里添加一个元素之前,该容器往往提前申请了一大块内存,实际添加时就只需要拿出其中一小块来使用,不用每添加一个都使用new 一次。内存池所做的,也就是一次申请一块大内存,然后再小块小块地拿出来用:一次申请 NM 大小的内存,必然比 N 次申请 M 大小的内存要快,这就是内存池高效的简单解释。 一般来说,内存池可以按两种维度划分:单线程与多线程,可变大小和固定大小。其中最简单的单线程固定大小的内存池。这类内存池只考虑单线程的程序,分配与回收的对象都是固定大小的。这个简单的内存池类模板声明如下: template class SimpleMemPool { private: #pragma pack(push, 1) union ObjectChunk { ObjectChunk * next; char buf[sizeof(T)]; }; struct MemBlock { MemBlock* next; ObjectChunk chunks[BaseSize]; }; #pragma pack(pop) SimpleMemPool(const SimpleMemPool &) ; MemBlock * head; ObjectChunk * freeChunk; public: SimpleMemPool(); ~SimpleMemPool(); T* New(); void Delete(T* t); }; template class SimpleMemPool { private: #pragma pack(push, 1) union ObjectChunk { ObjectChunk * next; char buf[sizeof(T)]; }; struct MemBlock { MemBlock* next; ObjectChunk chunks[BaseSize]; }; #pragma pack(pop) SimpleMemPool(const SimpleMemPool &) ; MemBlock * head; ObjectChunk * freeChunk; public: SimpleMemPool(); ~SimpleMemPool(); T* New(); void Delete(T* t); }; 该内存池类模板实例化之后,产生一个只用于申请对象T 的内存池。创建对象的方法是 T* New(),删除对象的方法是 void Delete(T *)。类模板中还定义了两个数据结构及两个成员变量,还禁止了内存池的拷贝构造。对于这种内存池,它...