⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 heap.h

📁 相当不错的入门程序
💻 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 + -