一、介绍
在实际开放中如果某个对象,需要频繁创建和销毁,且创建代价较大,我们可以用对象池来进行管理,在需要对象的时候我们在对象池中找一个空闲的对象,如果对象池中没有,先创建,并交给对象池进行管理,当对象使用完,将对象返回到对象池,用于下次调用。
二、用途
例如游戏服务器中玩家创建,当玩家上线我们需要给玩家创建一个对象,玩家对象创建开销大且很频繁,我们可以用对象池来管理玩家对象的创建和回收。
三、实现过程
在负责对象的类中,维护一个队列用于记录空闲的对象,当我们需要一个对象的时候就去队列之后拿,没有我们就创建一个对象,当对象使用完毕,将其放到队列中。在《四、编码实现》中我们用的是一个对象模板,原理都是一样,使用起来方便一些。
四、编码实现
#pragma once
#include <list>
#include <unordered_map>
//对象池
template<class T, ushort nStep = 8>
class COBjectPool
{
typedef std::list<T*> OBJECTPOOLLIST;
typedef std::unordered_map<T*, BOOL> OBJECTPOOLMAP;
public:
COBjectPool(){ }
~COBjectPool(){ }
public:
//获得一个空闲对象
T* GetFreeObject(void)
{
if (m_FreeObject.empty())
{
for (ushort i = 0; i < nStep; ++i)
{
T* p = new T;
m_FreeObject.push_back(p);
m_AllObject.push_back(p);
}
}
OBJECTPOOLLIST::iterator itr = m_FreeObject.begin();
T* p = (*itr);
m_FreeObject.erase(itr);
m_UseObject[p] = TRUE;
return p;
}
//回收一个空闲对象
void RecoveryObject(T* p)
{
auto iter = m_UseObject.find(p);
if (iter != m_UseObject.end())
{
m_UseObject.erase(iter);
m_FreeObject.push_back(p);
}
}
//销毁
void Destory()
{
for (OBJECTPOOLLIST::iterator itr = m_AllObject.begin(); itr != m_AllObject.end(); ++itr)
{
T* p = (*itr);
delete p;
}
m_AllObject.clear();
m_FreeObject.clear();
m_UseObject.clear();
}
private:
OBJECTPOOLLIST m_AllObject; //全部对象
OBJECTPOOLLIST m_FreeObject; //空闲队列
OBJECTPOOLMAP m_UseObject; //使用队列
};