⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 batchheap.h

📁 hoard内存管理器
💻 H
字号:
/* -*- C++ -*- */#ifndef _BATCHHEAP_H_#define _BATCHHEAP_H_#include <assert.h>template <class SuperHeap>class MultiMalloc : public SuperHeap {public:	// Sets ptr to a list of up to num objects of size sz	// and returns how many free objects ptr points to.	int multimalloc (int num, size_t sz, void *& ptr)	{		int i = 0;		ptr = (freeObject *) SuperHeap::malloc (sz);		freeObject * p = (freeObject *) ptr;		if (ptr != NULL) {			for (i = 1; i < num; i++) {				p->next = (freeObject *) SuperHeap::malloc (sz);				if (p->next == NULL)					break;				p = p->next;			}			p->next = NULL;		}		return i;	}	// Frees all num items pointed to by ptr	// and sets ptr to NULL.	void multifree (int num, void *& ptr)	{		freeObject * p;		freeObject * prev = (freeObject *) ptr;		for (int i = 0; i < num; i++) {			p = prev->next;			SuperHeap::free (prev);			prev = p;		}		ptr = NULL;	}private:  class freeObject {  public:    freeObject * next;  };};template <int BatchNumber, class SuperHeap>class BatchHeap : public SuperHeap {public:	BatchHeap (void)		: nObjects (0)	{		freeList[0] = NULL;		freeList[1] = NULL;	}	~BatchHeap (void) {		if (nObjects <= BatchNumber) {			SuperHeap::multifree (nObjects, (void *&) freeList[0]);		} else {			SuperHeap::multifree (BatchNumber, (void *&) freeList[0]);			SuperHeap::multifree (nObjects - BatchNumber, (void *&) freeList[1]);		}	}	inline void * malloc (size_t sz) {		if (nObjects == 0) {			// Obtain BatchNumber objects if we're out.			nObjects = SuperHeap::multimalloc (BatchNumber, sz, (void *&) freeList[0]);		}		assert (nObjects >= 1);		freeObject * ptr;		if (nObjects > BatchNumber) {			freeObject *& head = freeList[1];			ptr = head;			nObjects--;			head = head->next;			return (void *) ptr;		} else {			freeObject *& head = freeList[0];			ptr = head;			nObjects--;			head = head->next;			return (void *) ptr;		}	}	inline void free (void * ptr) {		if (nObjects <= BatchNumber) {			freeObject *& head = freeList[0];			((freeObject *) ptr)->next = head;			head = (freeObject *) ptr;		} else {			freeObject *& head = freeList[1];			((freeObject *) ptr)->next = head;			head = (freeObject *) ptr;		}		nObjects++;		if (nObjects == 2 * BatchNumber) {			// Free half of them.			assert (freeList[1] != NULL);			SuperHeap::multifree (BatchNumber, (void *&) freeList[1]);		}	}private:  class freeObject {  public:    freeObject * next;  };  int nObjects;  // The first free list holds the first BatchNumber objects,  // while the second free list holds the rest.  freeObject * freeList[2];};#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -