游戏服务器之自定义内存池管理器和空间配置器

本文介绍了游戏服务器中自定义内存池管理器和空间配置器的设计与应用。内存池管理器包含针对不同大小的内存池,通过空闲节点链表进行内存分配和回收。空间配置器利用内存池管理器来优化内存分配。讨论了内存分配原则,如1~1024 * 1024 字节的小对象使用内存池,大于此范围使用系统分配。并展示了在字符串、流和容器类(如vector、list)中的应用。
摘要由CSDN通过智能技术生成

设计上:

(1)内存分配器管理器(nMemoryAlloc):

内存分配器管理器含有针对不同内存大小的内存池数组。每个内存池对象含有空闲节点链表,管理分配和回收的节点对象内存。

(2)链表节点内存:

链表节点对象含有变长内存成员,适合分配各个长度的内存对象。但同一个内存池对象中的节点内存大小是一致的。

(3)内存分配原则:

1)内存分配器nMemoryAlloc对于内存大小在1~1024 * 1024 字节之间小对象使用内存池的管理,否则就使用系统默认的分配和删除接口,让系统管理内存。

2)内存分配器适用的是定长的类型。

(4)静态存储区使用:

内存池管理器中的内存池数组是静态的,对外提供静态接口。

(5)空间配置器:

空间配置器使用内存池管理器来管理器内存



1、内存池类型

内存池分配节点,没有内存就向系统申请,否则从空闲列表中获取。

内存池含空闲节点链表。

 

class MemPool2
{
private:
	struct _Node
	{
		_Node():next(NULL)
		{
		}
		~_Node()
		{
		}
	_Node* next;
	unsigned char data[0];//变长内存
	};
	
	_Node* mFreeNodeList;
	public: 
	unsigned long _all_alloc_size;//总共分配内存大小计数
	unsigned long _all_alloc_num;//分配节点计数
	unsigned long _all_use_num;//使用节点计数
	unsigned long _all_free_num;//空闲节点计数
	public: 
	
	MemPool2()
	: mFreeNodeList(NULL),_all_alloc_size(0),_all_alloc_num(0),_all_use_num(0),_all_free_num(0)
	{
	}
	
	void reset()//释放链表所有节点内存
	{
		_Node* p = mFreeNodeList;
		while(p)
		{
			_all_free_num ++;
			_Node* _p = p;
			p = p->next;
			char *tmp = (char *)_p;
			free(tmp);
		}
		mFreeNodeList = NULL;
	}
	~MemPool2(void)
	{
		_Node* p = mFreeNodeList;
		while(p)
		{
			_Node* _p = p;
			p = p->next;
			char *tmp = (char *)_p;
			free(tmp);
		}
		mFreeNodeList = NULL;
	}
	
	_Node* __allocData(int datasize)//实际分配节点(没有内存就向系统申请,否则从空闲列表中获取)
	{
		if(!mFreeNodeList)
		{
			_all_alloc_size += (sizeof(_Node) + datasize);//记录总分配大小
			_all_alloc_num ++;//记录分配节点数
			char *tmp = (char *)malloc(sizeof(_Node) + datasize);
			mFreeNodeList = (_Node *)tmp;
			constructInPlace(mFreeNodeList);
		}
		_all_use_num ++;
		_Node* p = mFreeNodeList;
		mFreeNodeList = mFreeNodeList->next;
		return p;//返回节点
	}
	
	unsigned char* alloc0(int datasize)//分配节点(没有内存就向系统申请,否则从空闲列表中获取)
	{
		_Node* p = __allocData(datasize);
		return (unsigned char*)(p->data);
	}
	
	void freePtr(unsigned char* &p)//回收节点的内存回链表表头
	{
		if (p)
		{
			_Node* pNod = (_Node*)(p - sizeof(_Node));//上一个链表节点(分配过的就会有)
			pNod->next = mFreeNodeList;
			mFreeNodeList = pNod;
			p = NULL;
			_all_use_num
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值