#include <boost/progress.hpp>
template<class T>
class MemoryPool
{
public:
MemoryPool(size_t size =EXPANSION_SIZE);
~MemoryPool();
//从空闲列表中分配T元素
inline void * alloc(size_t size);
inline void free(void * someElement);
private:
MemoryPool<T>* next;
enum{EXPANSION_SIZE=2};
//将空闲元素添加至空闲列表
void expanTheFreeList(int howMany=EXPANSION_SIZE);
};
template<class T>
MemoryPool<T>::MemoryPool(size_t size)
{
expanTheFreeList( size);
}
template<class T>
MemoryPool<T>::~MemoryPool()
{
MemoryPool<T> * nextPrt=next;
for(nextPrt=next;nextPrt!=NULL;nextPrt=next)
{
next=next->next;
// delete [] nextPrt;
delete [](char*)nextPrt;
}
}
template<class T>
inline void * MemoryPool<T>::alloc(size_t size)
{
if(!next)
{
expanTheFreeList();
}
MemoryPool<T> * head=next;
next=head->next;
return head;
}
template<class T>
inline
void MemoryPool<T>::free(void * doomed)
{
// MemoryPool<T> *head=static_cast<MemoryPool<T>* >(doomed);
MemoryPool<T> *head=(MemoryPool<T>* )(doomed);
head->next=next;
next=head;
}
template<class T>
void MemoryPool<T>::expanTheFreeList(int howmany)
{
size_t size=(sizeof(T)>sizeof(MemoryPool<T>*))? sizeof(T):sizeof(MemoryPool<T>*);
// MemoryPool<T>* runner =static_cast< MemoryPool<T>* >(new char [size]);
MemoryPool<T>* runner =( MemoryPool<T>* )(new char [size]);
next=runner;
for(int i=0 ;i<howmany;i++)
{
// runner->next=static_cast< MemoryPool<T>* >(new char [size]);
runner->next=( MemoryPool<T>* )(new char [size]);
runner=runner->next;
}
runner->next=0;
}
//使用内存池的类
class Rational
{
private:
int n;
int d;
static MemoryPool<Rational > *memPool;
public:
Rational(int a=0, int b=1) : n(a),d(b){}
void *operator new(size_t size){ return memPool->alloc(size); }
void operator delete(void* doomed, size_t size){ memPool->free(doomed); }
static void newMemPool(){ memPool=new MemoryPool <Rational >; }
static void deleteMemPool(){ delete memPool; }
};
MemoryPool<Rational>* Rational::memPool=0;
int main()
{
//...
Rational::newMemPool();
//start time...
//circle test like in the single thread memory pool.
Rational::deleteMemPool();
//stop time..
return 0;
}