您的位置:首页 > 编程语言 > C语言/C++

内存池的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}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: