内存池简单实例.docx
《内存池简单实例.docx》由会员分享,可在线阅读,更多相关《内存池简单实例.docx(5页珍藏版)》请在冰豆网上搜索。
内存池简单实例
内存池简单实例
分类:
C/C++#include<stdlib.h>
#include<stdio.h>
#include<time.h>
#include<iostream>usingnamespacestd;classMemPool
{
public:
MemPool();
~MemPool();
void*Alloc();
voidFree(void*p);
private:
conststaticintblockSize=1024;
conststaticintitemSize=16;
structItemNode
{
ItemNode*next;
chardata[itemSize-sizeof(ItemNode*)];
};
structBlockNode
{
BlockNode*next;
ItemNodedata[blockSize/itemSize];
};
ItemNode*freeItemNodeHead;
BlockNode*memBlockNodeHead;
};MemPool:
:
MemPool():
memBlockNodeHead(NULL),freeItemNodeHead(NULL)
{
}MemPool:
:
~MemPool()
{
BlockNode*temp=memBlockNodeHead;
while(temp)
{
memBlockNodeHead=memBlockNodeHead->next;
deletetemp;
temp=memBlockNodeHead;
}
}void*MemPool:
:
Alloc()
{
if(freeItemNodeHead==NULL)
{
BlockNode*tempBlockNode=newBlockNode;
if(tempBlockNode==NULL)
{
perror("allocatememoryerror!
\n");
exit
(1);
}
if(memBlockNodeHead==NULL)
{
memBlockNodeHead=tempBlockNode;
memBlockNodeHead->next=NULL;
}
else
{
tempBlockNode->next=memBlockNodeHead;
memBlockNodeHead=tempBlockNode;
}
freeItemNodeHead=&(memBlockNodeHead->data[0]);
inti=0;
while(i<blockSize/itemSize-1)
{
tempBlockNode->data[i].next=&(tempBlockNode->data[i+1]);
++i;
}
tempBlockNode->data[i].next=NULL;
}
ItemNode*allocItemNode=freeItemNodeHead;
freeItemNodeHead=freeItemNodeHead->next;
returnallocItemNode;
}voidMemPool:
:
Free(void*p)
{
ItemNode*tempItemNode=static_cast<ItemNode*>(p);
tempItemNode->next=freeItemNodeHead;
freeItemNodeHead=tempItemNode;
}intmain()
{
MemPoolpool;
char*p=NULL;
clock_tstart,finish;
doubleduration;
longi=0;
start=clock();
while(i<10000000)
{
p=static_cast<char*>(pool.Alloc());
//p=newchar[16];
++i;
pool.Free(p);
//deletep;
}
finish=clock();
duration=(double)(finish-start)/CLOCKS_PER_SEC;
cout<<"totaluse"<<duration<<"seconds"<<endl;
system("pause");
return0;
}
使用内存池的结果是:
totaluse0.245seconds
使用new,delete操作的结果是:
totaluse7.256seconds
结果相差近30倍,可见使用内存池对系统的性能有很大的提高
MemPool实现源码参见: