#include"MemoryPool.h"
MemoryPool::MemoryBlock::MemoryBlock(USHORT nTypes , USHORT nUnitSize )
{
this->nSize=nTypes*nUnitSize;
nFree=nTypes;
nFirst=0;
pNext=NULL;
{
char * pData = aData;
for (USHORT i = 1; i < nTypes; i++)
{
*reinterpret_cast<USHORT*>(pData) = i;
pData += nUnitSize;
}
}
}
MemoryPool::MemoryPool(USHORT unitSize,USHORT initSize,USHORT growSize)
{
this->initSize=initSize;
this->growSize=growSize;
if(unitSize<=2)
{
this->unitSize=2;
}
else if(unitSize>4)
{
this->unitSize = (unitSize + (MEMORY_ALLGNMENT-1)) & ~(MEMORY_ALLGNMENT-1);
}
else
{
this->unitSize=4;
}
pBlock=NULL;
blockNum=0;
}
void* MemoryPool::alloc()
{
if(!pBlock)
{
pBlock=new(initSize,unitSize)MemoryBlock(initSize,unitSize);
blockNum++;
}
MemoryBlock* pMyBlock = pBlock;
while (pMyBlock && !pMyBlock->nFree )
{
pMyBlock = pMyBlock->pNext;//寻找空闲内存块
}
if(pMyBlock)
{
char* pFree=(pMyBlock->aData+pMyBlock->nFirst*unitSize);//返回空闲地址
pMyBlock->nFree--;
pMyBlock->nFirst=*((USHORT*)pFree);
return static_cast<void*>(pFree);
}
else
{
if ( !growSize )
return NULL;
pMyBlock = new(growSize,unitSize)MemoryBlock(growSize,unitSize);;//扩展新的内存块
blockNum++;
pMyBlock->pNext = pBlock;
pBlock = pMyBlock;
pMyBlock->nFree--;
pMyBlock->nFirst=1;
return static_cast<void*>(pMyBlock->aData);
}
}
void MemoryPool::free(void* pFree)
{
MemoryBlock* pMyBlock = pBlock;
while ( ((ULONG)pMyBlock->aData > (ULONG)pFree) ||
((ULONG)pFree >= ((ULONG)pMyBlock->aData + pMyBlock->nSize)) )//判断内存地址是否在内存池内
{
pMyBlock=pMyBlock->pNext;
}
if(!pMyBlock)
return;
pMyBlock->nFree++;
*((USHORT*)pFree) = pMyBlock->nFirst;
pMyBlock->nFirst = (USHORT)(((ULONG)pFree-(ULONG)(pBlock->aData)) / unitSize);//修改链表结构
if(pMyBlock->nFree*unitSize==pMyBlock->nSize)//内存块完全空闲
{
if(pBlock==pMyBlock)
{
pBlock=pMyBlock->pNext;
MemoryBlock::operator delete(pMyBlock,0);//空闲块在头部
blockNum--;
}
else //空闲块在链表中部
{
MemoryBlock* pTemp=pBlock;
while(pTemp->pNext!=pMyBlock)
{
pTemp=pTemp->pNext;
}
pTemp->pNext=pMyBlock->pNext;
MemoryBlock::operator delete(pMyBlock,0);
blockNum--;
}
}
}
MemoryPool::~MemoryPool()
{
MemoryBlock* pMyBlock=pBlock;
while(pBlock)
{
pMyBlock=pBlock;
pBlock=pMyBlock->pNext;
MemoryBlock::operator delete(pMyBlock,0);
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
内存池.rar (4个子文件)
内存池
内存池技术.doc 306KB
MemoryPool.cpp 4KB
main.cpp 787B
MemoryPool.h 1002B
共 4 条
- 1
资源评论
- zhuzhu31742722012-09-29讲解的含详细 绑顶下
- xiaoeyu1112012-07-09soso 吧,不是理想的实现
Emiyasstar__
- 粉丝: 476
- 资源: 20
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功