单线程内存池

#include <boost/progress.hpp>

class NextOnFreeList
{
public:
	NextOnFreeList *next;
};

class Rational 
{
public:
	Rational(int a = 0, int b = 1) : n(a), d(b) {}

	inline void * operator new (size_t size);					//over load new and delete operator
	inline void  operator delete (void *doomed, size_t size);

	static void newMemPool() {expandTheFreeList();}
	static void deleteMemPool();
private:
	static NextOnFreeList * freelist;
	static void expandTheFreeList();
	enum {EXPANSION_SIZE = 32};

	int n;
	int d;
};


void * Rational::operator new( size_t size )
{
	if (0 == freelist)
	{
		expandTheFreeList(); //if not enough memory, expand.
	}

	NextOnFreeList *head = freelist;
	freelist = head->next;

	return head;
}

void Rational::operator delete( void *doomed, size_t size )
{
	NextOnFreeList *head = static_cast<NextOnFreeList *>(doomed);
	head->next = freelist;
	freelist = head;
}

void Rational::expandTheFreeList()
{
	size_t size = (sizeof(Rational) > sizeof(NextOnFreeList *)) ? sizeof(Rational) : sizeof(NextOnFreeList *);
	NextOnFreeList *runner = (NextOnFreeList *)( new char[size] );

	freelist = runner;
	for (int i = 0; i < EXPANSION_SIZE; ++i)
	{
		runner->next = (NextOnFreeList *)(new char[size]);
		runner = runner->next;
	}

	runner->next = 0;
}

void Rational::deleteMemPool()
{
    NextOnFreeList * nextPtr;
    for(nextPtr = freelist; nextPtr != NULL; nextPtr = freelist)
	{
		freelist = freelist->next;
		delete [](char *)nextPtr;
    }
}

NextOnFreeList * Rational::freelist =0;

int main()
{
	int s1 = sizeof(Rational) ;
	int s2 = sizeof(NextOnFreeList *);
	{
		boost::progress_timer t;//计时器
		
		Rational *array[1000];
		Rational::newMemPool();

		for (int j = 0; j < 500; ++j)
		{
			for (int i = 0; i < 1000; ++i)
			{
				array[i] = new Rational(i);
			}
			for (int i = 0; i < 1000; ++i)
			{
				delete array[i];
			}
		}

		Rational::deleteMemPool();

	}// t析构时自动输出流逝时间

	return 0;
}

  

 

posted @ 2013-09-23 14:40  calabashdad  阅读(224)  评论(0编辑  收藏  举报