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

📄 cmempool.cpp

📁 内存池
💻 CPP
字号:
/********************************************************************
	created:	2006/10/31
	created:	31:10:2006   21:10
	filename: 	d:\Gs\mempool\mempool\CMemPool.cpp
	file path:	d:\Gs\mempool\mempool
	file base:	CMemPool
	file ext:	cpp
	author:		Zhang Li
	
	purpose:	
*********************************************************************/

#include "CMemPool.h"


#define MEMPOOL_ALLOC(x) if (m_currentBlock##x != NULL)\
{\
	p = m_currentBlock##x;\
	m_currentBlock##x = m_currentBlock##x->m_prev;\
}

#define MEMPOOL_FREE(x) {\
	memBlock<x> *mp = (memBlock<x>*)p;\
	mp->m_prev = NULL;\
	m_memHead##x->m_prev = mp;\
	m_memHead##x = mp;\
}

#define MEMPOOL_INIT(x) m_memHead##x = (memBlock<x>*)malloc(sizeof(memBlock<x>));\
	m_memHead##x->m_prev = NULL;\
	m_currentBlock##x = m_memHead##x;\
	for (int i = 0; i < 512; ++i)\
{\
	memBlock<x> *p = (memBlock<x>*)malloc(sizeof(memBlock<x>));\
	p->m_prev = m_currentBlock##x;\
	m_currentBlock##x = p;\
}

#define MEMPOOL_RELEASE(x) 	while(m_currentBlock##x != NULL)\
{\
	memBlock<x> *p = m_currentBlock##x;\
	m_currentBlock##x = m_currentBlock##x->m_prev;\
	free(p);\
}

#define MEMPOOL_LOCK Lock lock;

CMemPool *CMemPool::m_MemPool = NULL;
CRITICAL_SECTION CMemPool::cs;

CMemPool::CMemPool()
{
	MEMPOOL_LOCK

	MEMPOOL_INIT(32)
	MEMPOOL_INIT(64)
	MEMPOOL_INIT(96)
	MEMPOOL_INIT(128)
	MEMPOOL_INIT(160)
	MEMPOOL_INIT(192)
	MEMPOOL_INIT(224)
	MEMPOOL_INIT(256)
}

void CMemPool::Release()
{
	MEMPOOL_LOCK

	MEMPOOL_RELEASE(32)
	MEMPOOL_RELEASE(64)
	MEMPOOL_RELEASE(96)
	MEMPOOL_RELEASE(128)
	MEMPOOL_RELEASE(160)
	MEMPOOL_RELEASE(192)
	MEMPOOL_RELEASE(224)
	MEMPOOL_RELEASE(256)
	delete m_MemPool;
	m_MemPool = NULL;
}

void CMemPool::_free(void *&p, unsigned int size)
{
	MEMPOOL_LOCK

	if (NULL == p)
	{
		return;
	}

	unsigned int AllocSize = size + 4;

	if (AllocSize% 32 != 0)
	{
		AllocSize += 32;
	}

	switch(AllocSize - (AllocSize % 32))
	{
	case 32:
		MEMPOOL_FREE(32)
			break;
	case 64:
		MEMPOOL_FREE(64)
			break;
	case 96:
		MEMPOOL_FREE(96)
			break;
	case 128:
		MEMPOOL_FREE(128)
			break;
	case 160:
		MEMPOOL_FREE(160)
			break;
	case 192:
		MEMPOOL_FREE(192)
			break;
	case 224:
		MEMPOOL_FREE(224)
			break;
	case 256:
		MEMPOOL_FREE(256)
			break;
	default:
		free(p);
		p = NULL;
	}
	p = NULL;
}

void *CMemPool::_alloc(unsigned int size)
{
	MEMPOOL_LOCK

	unsigned int AllocSize = size + 4;

	if (AllocSize% 32 != 0)
	{
		AllocSize += 32;
	}

	void *p = NULL;

	switch(AllocSize - (AllocSize % 32))
	{
	case 32:
		MEMPOOL_ALLOC(32)
			break;
	case 64:
		MEMPOOL_ALLOC(64)
			break;
	case 96:
		MEMPOOL_ALLOC(96)
			break;
	case 128:
		MEMPOOL_ALLOC(128)
			break;
	case 160:
		MEMPOOL_ALLOC(160)
			break;
	case 192:
		MEMPOOL_ALLOC(192)
			break;
	case 224:
		MEMPOOL_ALLOC(224)
			break;
	case 256:
		MEMPOOL_ALLOC(256)
			break;
	default:
		return malloc(size);
	}
	return p;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -