内存池的C++实现
2008-05-04 14:16
615 查看
由于毕业设计需要使用到内存池,用以提高程序性能,上网查阅资料,在《C++应用程序性能优化》一书中,提到了内存池的实现(http://www.ibm.com/developerworks/cn/linux/l-cn-ppp/index6.html?ca=drs-cn ,可以在线浏览内存池相关章节)
下面是实现的代码:
MemoryBlock.h
1class CMemoryBlock
2#include "MemoryBlock.h"
2
3#ifdef _DEBUG
4//#define new DEBUG_NEW
5#undef THIS_FILE
6static char THIS_FILE[]=__FILE__;
7#endif
8
9// Construction/Destruction
11
13
14CMemoryBlock::~CMemoryBlock()
15
19void * CMemoryBlock::operator new(size_t,USHORT nTypes, USHORT nUnitSize)
20
24void CMemoryBlock::operator delete(void *p,size_t)
25
29//初始化
30CMemoryBlock::CMemoryBlock (USHORT nTypes , USHORT nUnitSize)
31#include "MemoryBlock.h"
#define MEMPOOL_ALIGNMENT 4
class CMemoryPool
#include "MemoryPool.h"
2
3#ifdef _DEBUG
4#undef THIS_FILE
5static char THIS_FILE[]=__FILE__;
6//#define new DEBUG_NEW
7#endif
8
9// Construction/Destruction
11
13CMemoryPool::~CMemoryPool()
14
20//递归释放内存
21void CMemoryPool::FreeMemeoryBlock(CMemoryBlock *pMyBlock)
22
29
30CMemoryPool::CMemoryPool(USHORT _uUnitSize,USHORT _uInitSize,USHORT _uGrowSize)
31
49//申请内存
50void* CMemoryPool::Alloc()
51
86void CMemoryPool::Free(void* pFree)
87{
88 CMemoryBlock* pMyBlock = pBlock;
89 CMemoryBlock* pPreBlock = NULL; //pMyBlock指向Block的前一个Block,用于设置pNext
90 while((ULONG)pFree < (ULONG)pMyBlock->aData || (ULONG)pFree > (ULONG)(pMyBlock->aData + pMyBlock->nSize))
91 {
92 pPreBlock = pMyBlock;
93 pMyBlock = pMyBlock->pNext;
94
95 if(!pMyBlock)
96 return;
97 }
98 if(pMyBlock)
99 {
100 pMyBlock->nFree++;
101 *((USHORT*)pFree) = pMyBlock->nFirst;
102 pMyBlock->nFirst = (USHORT)(((ULONG)pFree - (ULONG)pMyBlock->aData)/nUnitSize);
103
104 if(pMyBlock->nFree * nUnitSize == pMyBlock->nSize) //如果全是自由块
105 {
106 if(!pMyBlock->pNext) //如果这是最后一个block,则将其释放
107 {
108 delete pMyBlock; //释放
109 if(pPreBlock)
110 pPreBlock->pNext = NULL; //设置上一块的pNext指向NULL
111 else
112 pBlock = NULL;
113 }
114
115 }
116 }
117}
下面是实现的代码:
MemoryBlock.h
1class CMemoryBlock
2#include "MemoryBlock.h"
2
3#ifdef _DEBUG
4//#define new DEBUG_NEW
5#undef THIS_FILE
6static char THIS_FILE[]=__FILE__;
7#endif
8
9// Construction/Destruction
11
13
14CMemoryBlock::~CMemoryBlock()
15
19void * CMemoryBlock::operator new(size_t,USHORT nTypes, USHORT nUnitSize)
20
24void CMemoryBlock::operator delete(void *p,size_t)
25
29//初始化
30CMemoryBlock::CMemoryBlock (USHORT nTypes , USHORT nUnitSize)
31#include "MemoryBlock.h"
#define MEMPOOL_ALIGNMENT 4
class CMemoryPool
#include "MemoryPool.h"
2
3#ifdef _DEBUG
4#undef THIS_FILE
5static char THIS_FILE[]=__FILE__;
6//#define new DEBUG_NEW
7#endif
8
9// Construction/Destruction
11
13CMemoryPool::~CMemoryPool()
14
20//递归释放内存
21void CMemoryPool::FreeMemeoryBlock(CMemoryBlock *pMyBlock)
22
29
30CMemoryPool::CMemoryPool(USHORT _uUnitSize,USHORT _uInitSize,USHORT _uGrowSize)
31
49//申请内存
50void* CMemoryPool::Alloc()
51
86void CMemoryPool::Free(void* pFree)
87{
88 CMemoryBlock* pMyBlock = pBlock;
89 CMemoryBlock* pPreBlock = NULL; //pMyBlock指向Block的前一个Block,用于设置pNext
90 while((ULONG)pFree < (ULONG)pMyBlock->aData || (ULONG)pFree > (ULONG)(pMyBlock->aData + pMyBlock->nSize))
91 {
92 pPreBlock = pMyBlock;
93 pMyBlock = pMyBlock->pNext;
94
95 if(!pMyBlock)
96 return;
97 }
98 if(pMyBlock)
99 {
100 pMyBlock->nFree++;
101 *((USHORT*)pFree) = pMyBlock->nFirst;
102 pMyBlock->nFirst = (USHORT)(((ULONG)pFree - (ULONG)pMyBlock->aData)/nUnitSize);
103
104 if(pMyBlock->nFree * nUnitSize == pMyBlock->nSize) //如果全是自由块
105 {
106 if(!pMyBlock->pNext) //如果这是最后一个block,则将其释放
107 {
108 delete pMyBlock; //释放
109 if(pPreBlock)
110 pPreBlock->pNext = NULL; //设置上一块的pNext指向NULL
111 else
112 pBlock = NULL;
113 }
114
115 }
116 }
117}