C++内存池实现( 二 )

Free的作用是释放内存,实质是把m_pAllocatedMemBlock指向的已分配内存移动到m_pFreeMemBlock指向的free内存里 。和Alloc的作用相反 。
pCurUnit要减去struct _Unit是为了从存储单元得到管理头的位置,堆是向上生长的 。
##测试##
#include "mempool.h"#include <time.h> CMemPool g_MemPool;class CTestClass{public: void *operator new(size_t);//重载运算符new void operator delete(void *p); private: char m_chBuf[1000];};void *CTestClass::operator new(size_t uiSize){ return g_MemPool.Alloc(uiSize); //分配g_MemPool的内存给它}void CTestClass::operator delete(void *p){ g_MemPool.Free(p);}class CTestClass2{private: char m_chBuf[1000];};timespec diff(timespec start, timespec end){ timespec temp; temp.tv_sec = end.tv_sec-start.tv_sec; temp.tv_nsec = end.tv_nsec-start.tv_nsec; return temp;}int main(){ timespec time1, time2; for(int iTestCnt=1; iTestCnt<=10; iTestCnt++) {unsigned int i;//使用内存池测试clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);for(i=0; i<100000*iTestCnt; i++){CTestClass *p = new CTestClass;delete p;}clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);cout << "[ Repeat " << 100000*iTestCnt << " Times ]"<< "Memory Pool Interval = " << diff(time1,time2).tv_nsec<< "ns" << endl;//使用系统调用测试clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);for(i=0; i<LOOP_TIMES; i++){CTestClass2 *p = new CTestClass2;delete p;}clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);cout << "[ Repeat " << LOOP_TIMES << " Times ]"<< "System Call Interval = " << diff(time1,time2).tv_nsec<< "ns" << endl; } return 0;}##结果##
从下图可以看出,只有当程序频繁地用系统调用malloc/free或者new/delete分配内存时,内存池有价值 。

C++内存池实现

文章插图
 




推荐阅读