1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
#include "StdAfx.h"
#include "MemPool.h"
#include <assert.h>
////#include "mmgr.h"
CMemPool mempool;
CMemPool::CMemPool()
{
for(size_t a=0; a < MAX_MEM_SIZE+1; a++){
nextFree[a]=0;
poolSize[a]=10;
}
}
void* CMemPool::Alloc(size_t n)
{
if(n > MAX_MEM_SIZE || n<4) {
#ifdef USE_MMGR
return (void*)new char[n];
#else
return ::operator new(n);
#endif
}
void* p=nextFree[n];
if (p) {
nextFree[n]=(*(void**)p);
} else {
#ifdef USE_MMGR
void* newBlock= (void*)new char[n*poolSize[n]];
#else
void* newBlock= ::operator new(n*poolSize[n]);
#endif
for (int i=0; i < poolSize[n]-1; ++i) {
*(void**)&((char*)newBlock)[(i)*n] = (void*)&((char*)newBlock)[(i+1)*n];
}
*(void**)&((char*)newBlock)[(poolSize[n]-1)*n] = 0;
p = newBlock;
nextFree[n] = (*(void**)p);
poolSize[n] *= 2;
}
return p;
}
void CMemPool::Free(void* p,size_t n)
{
if(p==0) return;
if(n>MAX_MEM_SIZE || n<4) {
#ifdef USE_MMGR
delete[] (char*)p;
#else
::operator delete(p);
#endif
return;
}
*(void**)p = nextFree[n];
nextFree[n] = p;
}
CMemPool::~CMemPool()
{
}
|