一、对象池的好处
对于一些需要频繁创建删除的对象变量,可以减少创建删除的性能消耗,以及读写消耗,同时也方便管理。
二、对象池的原理
对象池的实现需要三个脚本: 一个对象池脚本,一个对象管理脚本,一个对象脚本; 步骤: 1.通过对象管理类,从 对象池类 获取一个对象类实例,如果没有就创建一个,并返回对象引用。 2.获得引用之后,就可以直接使用对象的成员函数【没有对象池的话,这就是第一步】 3.当对象使用周期结束,仅清空数据,不删除对象,将其放入对象池中,等待下一次获取。
三、类定义
(1)对象池脚本 ObjectPool.h
template<class T, int num>
class ObjectPool
{
class ObjectNode
{
T obj;
ObjectNode * next_node;
bool isFree;
public:
ObjectNode():next_node(NULL), isFree(true){
obj = T();
}
}
class ObjectBlock
{
ObjectBlock *next_block;
ObjectNode *nodes;
ObjectBlock(int num):next_block(NULL){
nodes = new ObjectNode[num];
}
~ObjectBlock(){
delete [] nodes;
}
}
private:
ObjectBlock * m_fristBlock;
ObjectBlock * m_curBlock;
ObjectNode * m_firstFreeNode;
ObjectNode * m_lastFreeNode;
int usingObjects;
Mutex m_lock;
}
(2)对象管理 PacketMgr.h
class CPacketMgr
{
inline static CPacketMgr & instance(){
static CPacketMgr s_inst;
return s_inst;
}
inline static ObjectPool<MsgPacket, 100> &PacketPool(){
static ObjectPool<MsgPacket, 100> s_inst;
return s_inst;
}
inline static MsgPacket & Allocate(){
return *(PacketPool().Allocate());
}
inline void Free(MsgPacket &msg){
PacketPool().Free(msg);
}
inline static MsgPacket & FastAllocate(){
return *(PacketPool().FastAllocate());
}
inline void FastFree(MsgPacket &msg){
PacketPool().FastFree(msg);
}
}
#define PacketMgr CPacketMgr::instance()
(3) 对象 MsgPacket.h
class MsgPacket
{
MsgPacket(){}
~MsgPacket(){}
void destory()
{
}
void helloworld()
{
cout<<"helloworld"<<endl;
}
}
四、对象池使用(纯手写没测试,思路没问题)
#include<iostream>
#include<vector>
#include "ObjectPool.h"
#include "MsgPacket.h"
#include "PackrtMgr.h"
using namespace std;
int main()
{
MsgPacket &pkt = PacketMgr.Allocate();
pkt.helloworld();
PackMgr.Free(pkt);
return 0;
}
五、总结
对象池就是把对象的创建和释放进行集中管理,从而降低创建删除消耗,且不影响对象类实现。 而且只要对象类满足固定函数,就可以创建对象池,用法很方便。
|