一、内存池简介
内存池是池化技术中的一种形式。通常我们在编写程序的时候回使用 new delete 这些关键字来向操作系统申请内存,而这样造成的后果就是每次申请内存和释放内存的时候,都需要和操作系统的系统调用打交道,从堆中分配所需的内存。如果这样的操作太过频繁,就会找成大量的内存碎片进而降低内存的分配性能,甚至出现内存分配失败的情况。
而内存池就是为了解决这个问题而产生的一种技术。从内存分配的概念上看,内存申请无非就是向内存分配方索要一个指针,当向操作系统申请内存时,操作系统需要进行复杂的内存管理调度之后,才能正确的分配出一个相应的指针。而这个分配的过程中,我们还面临着分配失败的风险。
所以,每一次进行内存分配,就会消耗一次分配内存的时间,设这个时间为 T,那么进行 n 次分配总共消耗的时间就是 nT;如果我们一开始就确定好我们可能需要多少内存,那么在最初的时候就分配好这样的一块内存区域,当我们需要内存的时候,直接从这块已经分配好的内存中使用即可,那么总共需要的分配时间仅仅只有 T。当 n 越大时,节约的时间就越多。
二、内存池分配回收示例图

三、内存池代码实现
1、头文件
#include<iostream>
#include<vector>
2、内部实现
const int MEM_SIZE = 10;
template<typename T>
class MEM_Pool
{
public:
static MEM_Pool<T>* getInstance()
{
if (mmp == NULL)
{
mmp = new MEM_Pool<T>();
}
return mmp;
}
void* alloc(size_t size)
{
if (pool == NULL)
{
pool = (Node*)new char[(size + 4)*MEM_SIZE]();
Node* pCur = pool;
for (pCur; pCur < pool + MEM_SIZE - 1; pCur = pCur + 1)
{
pCur->pnext = pCur + 1;
}
pCur->pnext = NULL;
}
void* rt = pool;
pool = pool->pnext;
return rt;
}
void dealloc(void* ptr)
{
if (ptr == NULL)
{
return;
}
Node* pptr = (Node*)ptr;
pptr->pnext = pool;
pool = pptr;
}
private:
MEM_Pool()
{
pool = NULL;
}
MEM_Pool(const MEM_Pool<T>&);
class Node
{
public:
Node(T val = T()) :mdata(val), pnext(NULL){}
public:
T mdata;
Node* pnext;
};
Node* pool;
static MEM_Pool<T>* mmp;
};
template<typename T>
MEM_Pool<T>* MEM_Pool<T>::mmp = NULL;
四、内存池的优势
1、比 malloc 和 free 进行内存申请释放快;
2、不会产生或者很少产生内存碎片;
3、可避免内存泄漏;

396

被折叠的 条评论
为什么被折叠?



