虽然对于技术文章我也不喜欢粘源代码,但我喜欢直接。如果我写的正是您在找的,那对你就是最直接最有效的了。就让我们开门见山吧!
//作者: 邓超
//日期: 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... ) | 举报| 收藏