c++内存池
2016-01-29 11:34
337 查看
//以下是一个简易的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;
}
我是用一个双端队列来管理申请到的内存的。当程序需要申请是,从队头拿出来一个。释放时,将释放的内存块挂进队列。以下是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;
}
相关文章推荐
- leetcode刷题系列C++-Search in Rotated Sorted Array II
- socket编程之C语言一个简单监听程序
- c++随机数
- c++ 基类设计 需要注意的几点
- C语言程序员必读的5本书
- const和static的用法
- Notepad++搭配MinGW编译运行C,C++程序
- Notepad++配合MinGW直接编译运行C/C++代码的窍门
- Boost 学习之算法篇 partition_point
- 我不知道的C++
- C++文件读写详解(ofstream,ifstream,fstream)
- c语言:存款利息计算,1000元,存5年,求五种方案存款五年后的本息和
- c语言:我国国民生产总值的年增长率为10%,10年后国民生产总值与现在相比增长多少
- c语言:浪漫的putchar(),用数字向女朋友表白吧(ps:单身汪勿入)
- POJ3026 - Borg Maze [MST]
- C/C++区别
- 学习C字符串表示和字符串I/O(CprimerPlus11.1)的心得
- Effective C++: static_cast, const_cast
- C++复习五
- 减少C++代码编译时间的方法