转载  小型对象分配器之内存块 收藏

 虽然对于技术文章我也不喜欢粘源代码,但我喜欢直接。如果我写的正是您在找的,那对你就是最直接最有效的了。就让我们开门见山吧!

//作者: 邓超
//日期: 2006-6-24
//QQ:   23427470
//说明:大小固定的内存块,支持分配和回收内存
//  分配和回收算法是用一个字节数组表示一块连续的小内存
//  并把连续的内存块分成BLOCK_NUM 个小区.每个区的首字节
//  指向下一个可用内存区的索引号.类似用数组的方法实现一个
//  小内存块的链表,不过在内存地址上是连续的.这样做的目的是为了用
//  地址做判断.并用地址运算实现快速分配和回收

class CSMemoryBlock
 {
   enum{  BLOCK_NUM = 255,  };

 public:

  CSMemoryBlock(size_t blockSize)
  {
       m_blockSize = blockSize;
       m_pBlocks = new unsigned char[m_blockSize*BLOCK_NUM];

       for(int i=0; i<BLOCK_NUM; i++)
        m_pBlocks[i*m_blockSize] = i+1;

       m_fristAvailable = 0;
  }

  
virtual ~CSMemoryBlock(void)
  {
    delete[] m_pBlocks;
    m_pBlocks = NULL;  
  }

  void* Allot()
  {
    if(m_fristAvailable>=BLOCK_NUM)
    return NULL;
    unsigned char* p = m_pBlocks+m_fristAvailable*m_blockSize;
    m_fristAvailable = *p;
    return p;
  }

  void Free(void* p)
  {
    if(p == NULL) return;
    unsigned char* pc = (unsigned char*) p;
    if(pc<m_pBlocks || pc>(m_pBlocks+m_blockSize*(BLOCK_NUM-1)))
     return;
    *pc = m_fristAvailable;
    m_fristAvailable = (unsigned char)((pc-m_pBlocks)/m_blockSize);
  }
 
  size_t GetBlockSize(){ return m_blockSize; }

 private:

  size_t   m_blockSize;
  unsigned char *m_pBlocks;
  unsigned char m_fristAvailable;
 };

发表于 @ 2009年03月19日 17:36:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:c++单件模式 | 新一篇:用模板实现动态数组

  • 发表评论
  • 评论内容:
  •  
Copyright © firebird321
Powered by CSDN Blog