内存块MemoryBlock声明文件

内存块MemoryBlock声明文件

  1. #pragma once
  2. #define USHORT unsigned short
  3. #define ULONG unsigned long
  4. #include <iostream>
  5. using namespace std;
  6. //内存块
  7. struct MemoryBlock
  8. {
  9.     USHORT m_nSize;//可分配内存总大小
  10.     USHORT m_nFree;//可分配内存单元数目
  11.     USHORT m_nFirst;//第一个可用的内存单元位置
  12.     MemoryBlock* m_pNext;//指向下一个内存块
  13.     char m_data[1];
  14.     void* operator new(size_t,const USHORT& sum,const USHORT& unit_size)
  15.     {
  16.         return ::operator new(sizeof(MemoryBlock)+sum*unit_size);//申请一个内存块空间
  17.     }
  18.     void operator delete(void* del,size_t)
  19.     {
  20.         ::operator delete(del);//删除内存块空间
  21.     }
  22.     MemoryBlock(const USHORT& sum,const USHORT& unit_size)
  23.         :m_nSize(sum*unit_size),m_nFree(sum-1),m_nFirst(1),m_pNext(0)
  24.     {
  25.         char* pData=m_data;
  26.         for(int i=1;i<sum;i++)//初始化1到sum-1指向
  27.         {
  28.             *reinterpret_cast<USHORT*>(pData)=i;
  29.             pData+=unit_size;
  30.         }
  31.     }
  32.     ~MemoryBlock(){}
  33. };
内存池MemoryPool声明文件

  1. #pragma once
  2. #include "MemoryBlock.h"
  3. //内存池 a very good memory manager
  4. class MemoryPool
  5. {
  6. private:
  7.     USHORT m_nUnitSize;//一个可分配单元的大小
  8.     USHORT m_nInitSize;//第一个可分配空间数目
  9.     USHORT m_nGrowSize;//新增的可分配空间数目
  10.     MemoryBlock* m_pFirst;//指向第一个内存块
  11. public:
  12.     //单元大小,第一个内存块的可分配空间数目,第二个内存块之后的可分配空间数目
  13.     MemoryPool(const USHORT& unit_size,const USHORT& init_size=2048,const USHORT& grow_size=1024);
  14.     ~MemoryPool(void);
  15.     void* Alloc();//分配内存
  16.     void Free(void* pfree);//回收内存
  17.     void FreeMemoryBlock(MemoryBlock *pblock);//销毁
  18. };

内存池MemoryPool实现文件

  1. #include "MemoryPool.h"
  2. const USHORT MEMPOOL_ALIGNMENT=2;
  3. MemoryPool::MemoryPool(const USHORT &unit_size, const USHORT &init_size, const USHORT &grow_size)
  4.     :m_pFirst(0),
  5.     m_nInitSize(init_size),
  6.     m_nGrowSize(grow_size)
  7. {
  8.     if(unit_size>4)
  9.     {
  10.         m_nUnitSize = (unit_size + (MEMPOOL_ALIGNMENT-1)) & ~(MEMPOOL_ALIGNMENT-1);
  11.         //m_nUnitSize 取整到大于unit_size的最大的MEMPOOL_ALIGNMENT的倍数.
  12.         //令人纠结的注释
  13.     }
  14.     else if(unit_size>=2)
  15.         m_nUnitSize=4;
  16.     else
  17.         m_nUnitSize=2;
  18. }
  19. void* MemoryPool::Alloc()
  20. {
  21.     if(!m_pFirst)//如果是第一次申请
  22.     {
  23.         MemoryBlock* pmb_first=new (m_nInitSize,m_nUnitSize)MemoryBlock(m_nInitSize,m_nUnitSize);//14日凌晨至此
  24.         m_pFirst=pmb_first;
  25.         return (void*)pmb_first->m_data;
  26.     }
  27.     MemoryBlock* pmb_block=m_pFirst;
  28.     while(pmb_block&&pmb_block->m_nFree==0)//pmb_block没走到最后并且当前block没有可分配结点
  29.     {
  30.         pmb_block=pmb_block->m_pNext;//往后走吧。
  31.     }
  32.     if(pmb_block)//如果找到可分配结点的block
  33.     {
  34.         char* pfree=pmb_block->m_data+(pmb_block->m_nFirst*m_nUnitSize);
  35.         pmb_block->m_nFirst=*((USHORT*)pfree);
  36.         pmb_block->m_nFree--;//可分配节点自减
  37.         return (void*)pfree;
  38.     }
  39.     else//如果找不到,此时pmb_block值为0
  40.     {
  41.         if(m_nGrowSize==NULL)
  42.             return NULL;
  43.         pmb_block=new (m_nGrowSize,m_nUnitSize)MemoryBlock(m_nGrowSize,m_nUnitSize);
  44.         if(!pmb_block)//new不成功
  45.             return NULL;
  46.         pmb_block->m_pNext=m_pFirst;//把新建的block放到最前吧
  47.         m_pFirst=pmb_block;
  48.         return (void*)pmb_block->m_data;
  49.     }
  50. }

  51. void MemoryPool::Free(void* pfree)
  52. {
  53.     if(m_pFirst==NULL)
  54.         return;
  55.     MemoryBlock* pmb_block=m_pFirst;
  56.     MemoryBlock* pmb_preblock=m_pFirst;
  57.     while((ULONG)pfree<(ULONG)pmb_block->m_data||
  58.         (ULONG)pfree>(ULONG)(pmb_block->m_data+pmb_block->m_nSize))//pfree不在当前block中
  59.     {
  60.         pmb_preblock=pmb_block;//前一个block块
  61.         pmb_block=pmb_block->m_pNext;
  62.         if(!pmb_block)
  63.             return;
  64.     }
  65.     pmb_block->m_nFree++;//可分配数目+1
  66.     *((USHORT*)pfree)=pmb_block->m_nFirst;
  67.     pmb_block->m_nFirst=(USHORT)((ULONG)pfree-(ULONG)pmb_block->m_data)/m_nUnitSize;
  68.     if(pmb_block->m_nFree*m_nUnitSize==pmb_block->m_nSize)//如何该链块为空
  69.     {
  70.         pmb_preblock->m_pNext=pmb_block->m_pNext;
  71.         if((ULONG)pmb_preblock==(ULONG)m_pFirst)
  72.             m_pFirst=NULL;
  73.         delete pmb_block;
  74.     }
  75. }

  76. MemoryPool::~MemoryPool(void)
  77. {
  78.     if(m_pFirst)
  79.         FreeMemoryBlock(m_pFirst);
  80. }
  81. void MemoryPool::FreeMemoryBlock(MemoryBlock *pblock)
  82. {
  83.     if(pblock->m_pNext)
  84.         FreeMemoryBlock(pblock->m_pNext);
  85.     delete pblock;
  86.     pblock=NULL;
  87. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值