c++内存池

来源:互联网 发布:淘宝天天特价是什么 编辑:程序博客网 时间:2024/06/05 15:32

//以下是一个简易的c++内存池的实现。实现次内存池的目的是我们一次性向系统申请大块的内存,然后自己管理,这样可以避免重复向系统申请小块的内存而带来的系统开销。

我是用一个双端队列来管理申请到的内存的。当程序需要申请是,从队头拿出来一个。释放时,将释放的内存块挂进队列。以下是c++代码。

const int MEM_SIZE = 5;

class CQueue
{
public:
CQueue()
{
mpfront = new CQueueNode;
mprear = mpfront;
}
void AddNode(int data)
{
CQueueNode *ptmp = new CQueueNode(data);
mprear->pnext = ptmp;
mprear = ptmp;
}
void DelNode()
{
if(IsEmpty())
{
return ;
}
CQueueNode *ptmp = mpfront->pnext;
if(ptmp->pnext ==NULL)
{
mprear = mpfront;
}
mpfront->pnext = ptmp->pnext;
delete ptmp;


}


bool IsEmpty()
{
return mpfront==mprear;
}
private:
class CQueueNode
{
public:
CQueueNode(int data=0):mdata(data),pnext(NULL){}
~CQueueNode(){}
int mdata;
CQueueNode *pnext;
static CQueueNode *memcurnode;


void *operator new(size_t size);
void operator delete(void *ptr);
};
CQueueNode *mpfront;
CQueueNode *mprear;
friend ostream& operator<<(ostream &,CQueue &);
};
CQueue::CQueueNode * CQueue::CQueueNode::memcurnode = NULL;


void * CQueue::CQueueNode::operator new(size_t size)
{
CQueueNode *ptmp = NULL;
if(memcurnode==NULL)
{
size_t allocsize = MEM_SIZE*size;
memcurnode = (CQueueNode *)new char[allocsize];
ptmp = memcurnode;
for(;ptmp<memcurnode+MEM_SIZE-1;++ptmp)
{
ptmp->pnext = ptmp+1;
}
ptmp->pnext = NULL;
}
ptmp = memcurnode;
memcurnode = ->pnext;
return ptmp;
}


void CQueue::CQueueNode::operator delete(void *ptr)
{
if(ptr==NULL)
{
return ;
}
CQueueNode *ptmp=(CQueueNode*)ptr;
ptmp->pnext=memcurnode;
memcurnode=ptmp;
}


ostream& operator<<(ostream &out,CQueue &rhs)
{
CQueue::CQueueNode *ptmp = rhs.mpfront->pnext;
while(ptmp!=NULL)
{
cout<<ptmp->mdata<<" ";
ptmp=ptmp->pnext;
}
cout<<endl;
return out;
}
0 0
原创粉丝点击