频繁的分配和回收内存会严重的降低程序的性能。性能降低的原因在于默认的内存管理器是通用的,应用程序会以特定的方式使用内存,并且为不需要的功能付出代价,比方说单线程运行的程序不需要为处理多线程的部分付出代价。设计专用的内存管理器可以解决这个问题,设计时应该至少想到以下两个方面:
- 大小
- 并发
从大小角度:
- 固定大小:分配固定大小内存块的内存管理器
- 可变大小:分配任意大小内存块的内存管理器。所请求分配的大小实现是未知的。
从并发的角度:
- 单线程:内存的管理局限在一个线程内。内存被一个线程使用,并且不越出该线程的界限。这种内存管理器不涉及相互访问的多线程。
- 多线程:内存管理器被多个线程并发地使用。这种实现需要包含互斥执行的代码段。无论什么时候,只能有一个线程在执行一个代码段。
专用Rational内存管理器
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);inline void operator delete(void *doomed, size_t size);static void newMemPool() {expandTheFreeList();}static void deleteMemPool();private:static NextonFreeList *freeList; //Rational对象的空闲列表static void expandTheFreeList();enum {EXPANSION_SIZE = 32};int n;int d;}inlinevoid* Rational::operator new(size_t size){if (0 == freeList) { //如果列表为空,则将其填满expandTheFreeList();}NextOnFreeList *head = freeList;freeList = head->next;return head;}//Rationalinlinevoid 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 = static_cast<NextOnFreelist *> new char[size];freeList = runner;for(int i = 0; i < EXPANSION_SIZE; i++) {runner->next =static_cast<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 []nextPtr;}}
