一、介紹
在實際開放中如果某個對象,需要頻繁創建和銷燬,且創建代價較大,我們可以用對象池來進行管理,在需要對象的時候我們在對象池中找一個空閒的對象,如果對象池中沒有,先創建,並交給對象池進行管理,當對象使用完,將對象返回到對象池,用於下次調用。
二、用途
例如遊戲服務器中玩家創建,當玩家上線我們需要給玩家創建一個對象,玩家對象創建開銷大且很頻繁,我們可以用對象池來管理玩家對象的創建和回收。
三、實現過程
在負責對象的類中,維護一個隊列用於記錄空閒的對象,當我們需要一個對象的時候就去隊列之後拿,沒有我們就創建一個對象,當對象使用完畢,將其放到隊列中。在《四、編碼實現》中我們用的是一個對象模板,原理都是一樣,使用起來方便一些。
四、編碼實現
#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; //使用隊列
};