📄 heap.h
字号:
#ifndef __HEAPLIST__H__
#define __HEAPLIST__H__
#include "coll_list.h"
//////////////////////////////////////////////////////////////////////////
// 堆块列表(用于快速分配内存,无锁定)
class THeapList
{
public:
THeapList(DWORD dwInitBlockCount,DWORD dwBlockSize,DWORD dwUnitSize,BOOL bPoolOn);
virtual~THeapList();
LPBYTE AllocUnit();
VOID FreeUnit(LPBYTE pUnit);
DWORD GetBlockCount() { return m_lstBlock.GetCount(); };
DWORD GetUnitsCount() { return m_lstBlock.GetCount()*m_dwBlockSize; };
DWORD GetUsedCount() { return m_lstBlock.GetCount()*m_dwBlockSize-m_lstFree.GetCount(); };
DWORD GetFreeCount() { return m_lstFree.GetCount(); };
protected:
DWORD m_dwBlockSize;
DWORD m_dwUnitSize;
BOOL m_bPoolOn;
TListPtr m_lstBlock;
TListPtr m_lstFree;
};
//////////////////////////////////////////////////////////////////////////
// 堆块列表
THeapList::THeapList(DWORD dwInitBlockCount,DWORD dwBlockSize,DWORD dwUnitSize,BOOL bPoolOn)
: m_dwBlockSize(dwBlockSize)
, m_dwUnitSize(dwUnitSize)
, m_lstFree(dwBlockSize)
, m_bPoolOn(bPoolOn)
{
// 如果内存池开启,初始化时候分配适当的区块
if(bPoolOn)
{ for(DWORD dwBlockNo=0; dwBlockNo<dwInitBlockCount; dwBlockNo++)
{ LPVOID pBlock=malloc(dwBlockSize*dwUnitSize);
VERIFY(pBlock!=NULL);
m_lstBlock.AddTail(pBlock);
for(DWORD dwPartNo=0; dwPartNo<dwBlockSize; dwPartNo++)
m_lstFree.AddTail((LPBYTE)pBlock+dwPartNo*dwUnitSize);
}
}
}
THeapList::~THeapList()
{
m_lstFree.RemoveAll();
while(!m_lstBlock.IsEmpty())
{ LPVOID pBlock=m_lstBlock.RemoveHead();
TFREE(pBlock);
}
}
LPBYTE THeapList::AllocUnit()
{
// 如果内存池未开启,直接分配内存
if(!m_bPoolOn)
{ LPBYTE pHeap=new BYTE[m_dwUnitSize];
return pHeap;
}
// 如果空闲列表空,首先从空闲列表中进行分配
if(m_lstFree.IsEmpty())
{ LPVOID pBlock=malloc(m_dwBlockSize*m_dwUnitSize);
VERIFY(pBlock!=NULL);
m_lstBlock.AddTail(pBlock);
for(DWORD dwPartNo=0; dwPartNo<m_dwBlockSize; dwPartNo++)
m_lstFree.AddTail((LPBYTE)pBlock+dwPartNo*m_dwUnitSize);
}
// 分配出一个单元
return (LPBYTE)m_lstFree.RemoveHead();
}
VOID THeapList::FreeUnit(LPBYTE pUnit)
{
// 如果内存池未开启,直接分配内存
if(!m_bPoolOn)
{ delete[] pUnit;
return;
}
// 否则,从内存池中释放
m_lstFree.AddTail(pUnit);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -