内存池的C++实现。可能还有小bug。欢迎指正
2009-04-21 13:52
387 查看
最近在学习c++程序性能优化,读到内存池部分。自己动手写了一个,小小测试了一下应该没有问题。
内存块MemoryBlock声明文件
MemoryPool.cpp
#include "MemoryPool.h"
const USHORT MEMPOOL_ALIGNMENT=2;
MemoryPool::MemoryPool(const USHORT &unit_size, const USHORT &init_size, const USHORT &grow_size)
:m_pFirst(0),
m_nInitSize(init_size),
m_nGrowSize(grow_size)
{
if(unit_size>4)
{
m_nUnitSize = (unit_size + (MEMPOOL_ALIGNMENT-1)) & ~(MEMPOOL_ALIGNMENT-1);
//m_nUnitSize 取整到大于unit_size的最大的MEMPOOL_ALIGNMENT的倍数
.
//令人纠结的注释
}
else if(unit_size>=2)
m_nUnitSize=4;
else
m_nUnitSize=2;
}
void* MemoryPool::Alloc()
{
if(!m_pFirst)//如果是第一次申请
{
MemoryBlock* pmb_first=new (m_nInitSize,m_nUnitSize)MemoryBlock(m_nInitSize,m_nUnitSize);//14日凌晨至此
m_pFirst=pmb_first;
return (void*)pmb_first->m_data;
}
MemoryBlock* pmb_block=m_pFirst;
while(pmb_block&&pmb_block->m_nFree==0)//pmb_block没走到最后并且当前block没有可分配结点
{
pmb_block=pmb_block->m_pNext;//往后走吧。
}
if(pmb_block)//如果找到可分配结点的block
{
char* pfree=pmb_block->m_data+(pmb_block->m_nFirst*m_nUnitSize);
pmb_block->m_nFirst=*((USHORT*)pfree);
pmb_block->m_nFree--;//可分配节点自减
return (void*)pfree;
}
else//如果找不到,此时pmb_block值为0
{
if(m_nGrowSize==NULL)
return NULL;
pmb_block=new (m_nGrowSize,m_nUnitSize)MemoryBlock(m_nGrowSize,m_nUnitSize);
if(!pmb_block)//new不成功
return NULL;
pmb_block->m_pNext=m_pFirst;//把新建的block放到最前吧
m_pFirst=pmb_block;
return (void*)pmb_block->m_data;
}
}
void MemoryPool::Free(void* pfree)
{
if(m_pFirst==NULL)
return;
MemoryBlock* pmb_block=m_pFirst;
MemoryBlock* pmb_preblock=m_pFirst;
while((ULONG)pfree<(ULONG)pmb_block->m_data||
(ULONG)pfree>(ULONG)(pmb_block->m_data+pmb_block->m_nSize))//pfree不在当前block中
{
pmb_preblock=pmb_block;//前一个block块
pmb_block=pmb_block->m_pNext;
if(!pmb_block)
return;
}
pmb_block->m_nFree++;//可分配数目+1
*((USHORT*)pfree)=pmb_block->m_nFirst;
pmb_block->m_nFirst=(USHORT)((ULONG)pfree-(ULONG)pmb_block->m_data)/m_nUnitSize;
if(pmb_block->m_nFree*m_nUnitSize==pmb_block->m_nSize)//如何该链块为空
{
pmb_preblock->m_pNext=pmb_block->m_pNext;
if((ULONG)pmb_preblock==(ULONG)m_pFirst)
m_pFirst=NULL;
delete pmb_block;
}
}
MemoryPool::~MemoryPool(void)
{
if(m_pFirst)
FreeMemoryBlock(m_pFirst);
}
void MemoryPool::FreeMemoryBlock(MemoryBlock *pblock)
{
if(pblock->m_pNext)
FreeMemoryBlock(pblock->m_pNext);
delete pblock;
pblock=NULL;
}
Test.cpp
#include "MemoryPool.h"
#include "time.h"
void performance_old()
{
clock_t start,stop;
start = clock();//开始时间
int i,b=0;
for(i=0;i<=100000;i++)
{
int* p=new int;
}
cout<<"Without MemoryPool:"<<(double) (clock()-start)<<"ms"<<endl;//输出
}
void memory()
{
clock_t start;
start = clock();//开始时间
MemoryPool mp(sizeof(int),10000,500);
int i=0;
for(i=0;i<=100000;i++)
{
int* p=(int*)mp.Alloc();
}
cout<<"Using MemoryPool:"<<(double)(clock()-start)<<"ms";//输出
}
int main()
{
performance_old();
memory();//内存池
system("pause");
return 0;
}
内存块MemoryBlock声明文件
MemoryPool.cpp
#include "MemoryPool.h"
const USHORT MEMPOOL_ALIGNMENT=2;
MemoryPool::MemoryPool(const USHORT &unit_size, const USHORT &init_size, const USHORT &grow_size)
:m_pFirst(0),
m_nInitSize(init_size),
m_nGrowSize(grow_size)
{
if(unit_size>4)
{
m_nUnitSize = (unit_size + (MEMPOOL_ALIGNMENT-1)) & ~(MEMPOOL_ALIGNMENT-1);
//m_nUnitSize 取整到大于unit_size的最大的MEMPOOL_ALIGNMENT的倍数
.
//令人纠结的注释
}
else if(unit_size>=2)
m_nUnitSize=4;
else
m_nUnitSize=2;
}
void* MemoryPool::Alloc()
{
if(!m_pFirst)//如果是第一次申请
{
MemoryBlock* pmb_first=new (m_nInitSize,m_nUnitSize)MemoryBlock(m_nInitSize,m_nUnitSize);//14日凌晨至此
m_pFirst=pmb_first;
return (void*)pmb_first->m_data;
}
MemoryBlock* pmb_block=m_pFirst;
while(pmb_block&&pmb_block->m_nFree==0)//pmb_block没走到最后并且当前block没有可分配结点
{
pmb_block=pmb_block->m_pNext;//往后走吧。
}
if(pmb_block)//如果找到可分配结点的block
{
char* pfree=pmb_block->m_data+(pmb_block->m_nFirst*m_nUnitSize);
pmb_block->m_nFirst=*((USHORT*)pfree);
pmb_block->m_nFree--;//可分配节点自减
return (void*)pfree;
}
else//如果找不到,此时pmb_block值为0
{
if(m_nGrowSize==NULL)
return NULL;
pmb_block=new (m_nGrowSize,m_nUnitSize)MemoryBlock(m_nGrowSize,m_nUnitSize);
if(!pmb_block)//new不成功
return NULL;
pmb_block->m_pNext=m_pFirst;//把新建的block放到最前吧
m_pFirst=pmb_block;
return (void*)pmb_block->m_data;
}
}
void MemoryPool::Free(void* pfree)
{
if(m_pFirst==NULL)
return;
MemoryBlock* pmb_block=m_pFirst;
MemoryBlock* pmb_preblock=m_pFirst;
while((ULONG)pfree<(ULONG)pmb_block->m_data||
(ULONG)pfree>(ULONG)(pmb_block->m_data+pmb_block->m_nSize))//pfree不在当前block中
{
pmb_preblock=pmb_block;//前一个block块
pmb_block=pmb_block->m_pNext;
if(!pmb_block)
return;
}
pmb_block->m_nFree++;//可分配数目+1
*((USHORT*)pfree)=pmb_block->m_nFirst;
pmb_block->m_nFirst=(USHORT)((ULONG)pfree-(ULONG)pmb_block->m_data)/m_nUnitSize;
if(pmb_block->m_nFree*m_nUnitSize==pmb_block->m_nSize)//如何该链块为空
{
pmb_preblock->m_pNext=pmb_block->m_pNext;
if((ULONG)pmb_preblock==(ULONG)m_pFirst)
m_pFirst=NULL;
delete pmb_block;
}
}
MemoryPool::~MemoryPool(void)
{
if(m_pFirst)
FreeMemoryBlock(m_pFirst);
}
void MemoryPool::FreeMemoryBlock(MemoryBlock *pblock)
{
if(pblock->m_pNext)
FreeMemoryBlock(pblock->m_pNext);
delete pblock;
pblock=NULL;
}
Test.cpp
#include "MemoryPool.h"
#include "time.h"
void performance_old()
{
clock_t start,stop;
start = clock();//开始时间
int i,b=0;
for(i=0;i<=100000;i++)
{
int* p=new int;
}
cout<<"Without MemoryPool:"<<(double) (clock()-start)<<"ms"<<endl;//输出
}
void memory()
{
clock_t start;
start = clock();//开始时间
MemoryPool mp(sizeof(int),10000,500);
int i=0;
for(i=0;i<=100000;i++)
{
int* p=(int*)mp.Alloc();
}
cout<<"Using MemoryPool:"<<(double)(clock()-start)<<"ms";//输出
}
int main()
{
performance_old();
memory();//内存池
system("pause");
return 0;
}
相关文章推荐
- 内存池的C++实现。可能还有小bug。欢迎指正
- 用C++重写String类,实现并不是最完美的,欢迎指正补充!后续还有更多类似的实现放上来, 欢迎关注!!!
- android 计算器,纯手打,功能实现了,bug可能还有点
- C++实现split,若有问题,请指正。(有用C实现过的,欢迎贴代码)
- 模拟实现VC中的handle的c++方法,欢迎指正~~~
- C#语言实现对网页图片的随机抓取。基础办法,但还有一点小问题,欢迎大家指正
- Android中遇到的一切BUG(到目前为止,这是我笔记薄别瞎喷,错误欢迎指正)
- CAF(C++ actor framework)(序列化之复杂类,分析 还有自己不懂的细思恐极函数实现)(三)
- C++内存池实现
- C++实现多线程全局内存池
- quick-cocos2d-x 2.2.3 rc版本中 crypto.md5file() 的C++实现在ANDROID上有BUG
- c++内存池实现
- c++内存池实现
- C++给类实现内存池的功能
- C++实现内存池
- C++模板来实现一个通用的内存池.
- C++实现堆排序并记录编程中遇到的一个bug(不要对无符号整形数在--的循环中采用>=0作为结束条件)
- C++内存池的实现实例
- 内存池的C++实现
- 使用C/C++实现内存池技术