內存塊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. }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章