189 8069 5689

【C++项目】定长内存池-创新互联

解决固定大小的内存申请释放需求

创新互联专注于酒泉网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供酒泉营销型网站建设,酒泉网站制作、酒泉网页设计、酒泉网站官网定制、微信小程序定制开发服务,打造酒泉网络公司原创品牌,更为您提供酒泉网站排名全网营销落地服务。

性能达到极致,不考虑内存碎片等问题

第一次: 

#includeusing std::cout;
using std::endl;

templateclass ObjectPool
{
public:
	T* New()
	{
		if (RemainBytes< sizeof(T))//如果剩余的内存不足一个对象的大小
		{
			_memory = (char*)malloc(128 * 1024);//128KB空间
			if (_memory == nullptr)
			{
				throw bad_alloc();
			}
		}
		T*obj = (T*)_memory;
		_memory += sizeof(T);
		RemainBytes -= sizeof(T);
		return ojb;
	}
	void Delete(T* obj)
	{
		if (_freeList == nullptr)
		{
			_freeList = obj;
			//*(int*)obj = nullptr;//32位平台下
			*(void**)obj = nullptr;//解引用看void*大小
		}
	}
private:
	char* _memory = nullptr;//一个char一个字节,往后方便切出内存块,指向大块内存的指针
	void* _freeList = nullptr;//还回来过程中的链接的自由链表指针
	size_t RemainBytes = 0;//大块内存在切分的过程中剩余的字节数
};

内存的释放:

void Delete(T* obj)
	{
		if (_freeList == nullptr)
		{
			_freeList = obj;
			//*(int*)obj = nullptr;//32位平台下
			*(void**)obj = nullptr;//解引用看void*大小
		}
		else
		{
			*(void**)obj = _freeList;
			_freeList = obj;
		}
	}

===》优化成链表的头插

void Delete(T* obj)
	{
		*(void**)obj = _freeList;
		_freeList = obj;
	}

定长内存池的完整代码的实现:

#includeusing std::cout;
using std::endl;

templateclass ObjectPool
{
public:
	T* New()
	{
		T*obj = nullptr;
		//优先把还回来的内存块对象再次重复利用
		if (_freeList)
		{
			void* next = *(void**)_freeList;
			obj = _freeList;//还回来的内存块
			_freeList = next;
		}
		else
		{
			if (_RemainBytes< sizeof(T))//如果剩余的内存不足一个对象的大小
			{
				_RemainBytes = 128 * 1024;
				_memory = (char*)malloc(_RemainBytes);//128KB空间
				if (_memory == nullptr)
				{
					throw bad_alloc();
				}
			}
			obj = (T*)_memory;
			size_t objSize = sizeof(T)< sizeof(void*) ? sizeof(void*) : sizeof(T);
			_memory += objSize;
			_RemainBytes -= objSize;
		}
		//定位new,显示调用T的构造函数初始化
		new(obj)T;

		return obj;
	}
	void Delete(T* obj)
	{
		obj->~T()//显示调用析构函数
		//链表的头插
		*(void**)obj = _freeList;
		_freeList = obj;
	}
private:
	char* _memory = nullptr;//一个char一个字节,往后方便切出内存块,指向大块内存的指针
	void* _freeList = nullptr;//还回来过程中的链接的自由链表指针
	size_t _RemainBytes = 0;//大块内存在切分的过程中剩余的字节数
};

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


本文标题:【C++项目】定长内存池-创新互联
网页网址:http://cdxtjz.cn/article/dscocj.html

其他资讯