标签:
1 #ifndef _MEMPOOL_H_ 2 #define _MEMPOOL_H_ 3 #include<iostream> 4 template<typename T> 5 class CMemPool{ 6 private: 7 CMemPool<T>* m_pFreeList; 8 public: 9 enum{EAXPANSION = 32}; 10 CMemPool(unsigned int nItemCount = EAXPANSION){ 11 ExpandFreeList(nItemCount); 12 } 13 ~CMemPool(){ 14 CMemPool<T>* pNext = NULL; 15 for(pNext = m_pFreeList;pNext!=NULL;pNext = m_pFreeList){ 16 m_pFreeList = m_pFreeList->m_pFreeList; 17 delete[] (char*)pNext; 18 } 19 } 20 void* Alloc(size_t){ 21 if(m_pFreeList==NULL){ 22 ExpandFreeList(); 23 } 24 std::cout<<"ALLOC called"<<std::endl; 25 CMemPool<T>* phead = m_pFreeList; 26 m_pFreeList = m_pFreeList->m_pFreeList; 27 return phead; 28 } 29 void Free(void* p){ 30 CMemPool<T>* phead = static_cast<CMemPool<T>*>(p); 31 phead->m_pFreeList = m_pFreeList; 32 m_pFreeList = phead; 33 std::cout<<"Free called"<<std::endl; 34 } 35 protected: 36 void ExpandFreeList(unsigned int nItemcount = EAXPANSION){ 37 unsigned int nSize = sizeof(T)>sizeof(CMemPool<T>*)?sizeof(T):sizeof(CMemPool<T>*); 38 CMemPool<T>* plastItem = static_cast<CMemPool<T>*>(static_cast<void*> (new char[nSize])); 39 m_pFreeList = plastItem; 40 for(int i=0;i<nItemcount-1;i++){ 41 plastItem->m_pFreeList = static_cast<CMemPool<T>*>(static_cast<void*>(new char[nSize])); 42 plastItem = plastItem->m_pFreeList; 43 } 44 plastItem->m_pFreeList = NULL; 45 } 46 }; 47 #endif
1 #include<iostream> 2 #include<Windows.h> 3 using namespace std; 4 #include "mempool.h" 5 6 7 class CTest{ 8 public: 9 int m; 10 int n; 11 void* operator new(size_t size){ 12 void* p = s_pool->Alloc(size); 13 return p; 14 } 15 void operator delete(void* p){ 16 s_pool->Free(p); 17 return; 18 } 19 static void NewPool(){ 20 s_pool = new CMemPool<CTest>; 21 } 22 static void DelPool(){ 23 delete s_pool; 24 return; 25 } 26 static CMemPool<CTest>* s_pool; 27 }; 28 CMemPool<CTest>* CTest::s_pool=NULL; 29 30 void TestFun(){ 31 int i; 32 const int nLoop = 10; 33 const int nCount = 10; 34 35 for(int j = 0; j<nLoop; ++j) 36 { 37 typedef CTest* LPTest; 38 LPTest arData[nCount]; 39 for(i=0;i <nCount; ++i) 40 { 41 arData[i] = new CTest; 42 } 43 44 for(i=0;i <nCount; ++i) 45 { 46 delete arData[i]; 47 } 48 } 49 } 50 51 int main(int argc, char* argv[]) 52 { 53 { 54 unsigned int dwStartTickCount = GetTickCount(); 55 56 CTest::NewPool(); 57 58 TestFun(); 59 60 CTest::DelPool(); 61 62 cout << "total cost" << GetTickCount() - dwStartTickCount << endl; 63 } 64 system("pause"); 65 66 return 0; 67 }
转:http://www.2cto.com/kf/201205/130457.html
标签:
原文地址:http://www.cnblogs.com/zhang-wen/p/4777648.html