高性能对象池

服务器开发过程中,经常性的需要创建一块内存,但是在并发量高的情况下频繁创建删除,并不合适。所以需要一个对象池来管理常用的内存。

#include<queue>
#include<unordered_map>
#include <memory>
#include "CodeException.h"
class ObjectPool
{
	const int _object_size;
	std::queue<char*> _free_objects;
public:
	ObjectPool(int objectSize):_object_size(objectSize){}
	~ObjectPool() {
		int iSize = _free_objects.size();
		for (int i = 0; i < iSize; i++)
		{
			free(_free_objects.front());
		}		
	}
	inline char* Create() {
		char* pObjectAddr = nullptr;
		if (_free_objects.empty())
		{
			pObjectAddr = static_cast<char*>malloc(_object_size);
			if (nullptr == pObjectAddr) throw  CodeExceptionLog("can't malloc memory");
		}
		else
		{
			pObjectAddr = _free_objects.front();
			_free_objects.pop();
		}
		return pObjectAddr;
	}
	inline void Release(char* pObjectAddr) {
		if (nullptr == pObjectAddr)  throw CodeExceptionLog("illegal args");
		_free_objects.push(pObjectAddr);
	}
};
typedef std::unordered_map<int, ObjectPool*> CMapObjectPool;
class ObjectAllocator
{
	CMapObjectPool _map_object_pool;
private:
	ObjectAllocator() = default;
	ObjectAllocator(const ObjectAllocator&) = delete;
	ObjectAllocator& operator=(const ObjectAllocator&) = delete;
public:
	~ObjectAllocator() {
		for (auto item : _map_object_pool)
		{
			delete item.second;
		}
		_map_object_pool.clear();
	}
	
	template<typename Type>	
	inline void Init() {
		int objectSize = sizeof(Type);
		_map_object_pool[objectSize] = new ObjectPool(objectSize);;
	}
public:
	static ObjectAllocator& getInstance() {
		static ObjectAllocator _g_instance;
		return _g_instance;
	}
	template<typename Type, typename ...Args>
	inline Type* allocate(const Args&... args) {
		ObjectPool* pObjectPool = FindObjectPool(sizeof(Type));
		return new(pObjectPool->Create())Type(args...);
	}
	template<typename Type>
	inline void deletor(Type* pType) {
		if (nullptr == pType)  throw CodeExceptionLog("illegal args");
		ObjectPool* pObjectPool = FindObjectPool(sizeof(Type));
		pType->~Type();
		pObjectPool->Release(reinterpret_cast<char*>(pType));
	}
private:
	inline ObjectPool* FindObjectPool(int objectSize) {
		auto ite = _map_object_pool.find(objectSize);
		if (_map_object_pool.end() == ite)   throw CodeExceptionLog("illegal args");
		return ite->second;
	}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值