读书人

内存储器池

发布时间: 2012-07-27 11:03:00 作者: rapoo

内存池
#include<iostream>
#include<vector>

using namespace std;

#define USHORT int
#define ULONG long
#define MEMPOOL_ALIGNMENT 4

struct CMemBlock
{
public:
int nSize;
int nfree;
USHORT nfirst;
CMemBlock* pnext;
char aData[1];

CMemBlock(USHORT m_InitSize, USHORT nUnitSize);
~CMemBlock();
static void* operator new(size_t, USHORT m_InitSize, USHORT nUnitSize)
{
return ::operator new(sizeof(CMemBlock) + m_InitSize * nUnitSize);
}

};

CMemBlock::CMemBlock(USHORT m_InitSize, USHORT nUnitSize)
{
nSize = m_InitSize * nUnitSize;
nfree = m_InitSize-1;
nfirst = 1;
pnext = NULL;

char * pData = aData;
for (USHORT i = 1; i < m_InitSize; i++)
{
*reinterpret_cast<USHORT*>(pData) = i;
pData += nUnitSize;
}

}

//memorypool
class CMemPool
{
private:
int m_UnitSize;
int m_InitSize;
CMemBlock* pBlock;
public:
CMemPool();
~CMemPool(){}
void* get();
void free(void *p);
void setUnitSize(int UnitSize){m_UnitSize = UnitSize;}
int getUnitSize(){return m_UnitSize;}
void setInitSize(int InitSize){m_InitSize = InitSize;}
int getInitSize(){return m_InitSize;}
};
CMemPool::CMemPool()
{
m_UnitSize = 4;
m_InitSize = 100;
pBlock = NULL;

if(m_UnitSize>4)
{
m_UnitSize = (m_UnitSize + MEMPOOL_ALIGNMENT-1)&~(MEMPOOL_ALIGNMENT-1);
}
else if(m_UnitSize<=2)
m_UnitSize = 2;
else
m_UnitSize =4;
}

void* CMemPool::get()
{
if(!pBlock)
{

pBlock = new CMemBlock(m_InitSize,m_UnitSize);
cout<<"chuangjian chenggong~~~~~~~"<<endl;
return (void *)pBlock->aData;
}
CMemBlock* p1 = pBlock;
while(p1&&!p1->nfree)
p1 = p1->pnext;
if(p1)
{
char* pfree = p1->aData+(p1->nfirst*m_UnitSize);
p1->nfirst = *((USHORT *)pfree);
p1->nfree--;
return (void *)pfree;
}
else
cout<<"~~~~~enough~~~~~~~~";
}
void CMemPool::free(void *p)
{
CMemBlock* p2 = pBlock;
while((((ULONG)p2->aData>(ULONG)p)||(ULONG)p>((ULONG)p2->aData+p2->nSize))&&p2)
{
p2 = p2->pnext;
}

if(p2)
{
p2->nfree++;
*((USHORT*)p) = p2->nfirst;
p2->nfirst = (USHORT)(((ULONG)p-(ULONG)p2->aData)/m_UnitSize);
}
}


int main()
{
CMemPool pool;
pool.get();
return 0;

}

编译时遇到以下错误:mempool.cpp: In member function ‘void* CMemPool::get()’:
mempool.cpp:82: error: no matching function for call to ‘CMemBlock::operator new(unsigned int)’
mempool.cpp:21: note: candidates are: static void* CMemBlock::operator new(size_t, int, int)
请大家帮我看看怎么改改。


[解决办法]
http://topic.csdn.net/u/20120629/09/42e3fbb3-d319-48ca-ad5b-eac88a8070b7.html
可参照此链接的pFirst = new(nInitSize, nTypeSize) FixedMemBlock(nInitSize, nTypeSize);方式申请

读书人网 >C++

热点推荐