简单的内存对象池

同学们在开发中会发现其实C++的对象分配—使用new,需要花费很多时间,特别对于那些需要频繁创建和释放对象的程序;更糟糕的是,随着时间的流逝,内存将形成碎片,当它运行了很长时间,应用程序的运行越来越慢 
简单对象内存池设计图[点击放大]
简单对象内存池设计图 来源:朱翔
本文我将介绍一种简单的内存对象池,,来减少内存对象构造和释放的开销,减少内存碎片,提高程序效率。上面是简单对象池设计图。  简单内存对象池的具体设计如下:  第一步:对象池是由对象链表_objectList构成,对象必须拥有一个成员变量_poolListNext,指向下一个对象。  第二步:为了提高效率,可以预申请一组对象_preAllocated[INITIAL_ALLOC],下面是构造对象池的代码: 
  
  
SimpleObjectPool () : _objectList(NULL),//初始化对象列表 _objectCount(INITIAL_ALLOC)//将对象池中对象的数目置为INITIAL_ALLOC { //使用预分配的对象构造对象链表 for(int i=0; i<initial_alloc; i++)="" {="" _preallocated[i]._poollistnext="_objectList;" _objectlist="&_preAllocated[i];" }="" <="" blockquote="" style="margin: 0px; padding: 0px; "> 第三步:通过ObtainObject函数从对象池中获取对象
OBJECT *ObtainObject () { OBJECT *object; if(_objectList == NULL) //如果对象池中已经没有对象,则创建一个新的对象 { object = new OBJECT(); object->_poolListNext = NULL; _objectCount++; //将对象计数加一 } else //如果对象链表_objectList中还有空闲对象,则从链表中取下一个空闲对象 { object = _objectList; _objectList = object->_poolListNext; object->_poolListNext = NULL; } return object; //返回对象 }
下一章我将介绍如何从如何释放使用完的对象到对象池,如何释放对象池,以及如何使用SimpleObjectPool。
上一章中我们介绍了SimpleObjectPool的设计思想,这一章我们着重介绍如何释放使用完的对象到对象池,如何释放对象池,并给出使用SimpleObjectPool的使用方法。 
第四步:释放使用完的对象到对象池
     
     
/* 释放使用完的对象到对象池 */ void ReleaseObject (OBJECT *object) { //将使用完的对象object置于对象列表的头部 object->_poolListNext = _objectList; _objectList = object; }
第五步:释放对象池
/*释放对象池*/ void Destruct () { //如果对象池中存在的对象数目大于0 while(_objectCount > 0) { OBJECT *tmp = _objectList; _objectList = tmp->_poolListNext; // 判断是否是预分配对象,不用释放预分配的对象 if((tmp < &_preAllocated[0]) || (tmp >= &_preAllocated[INITIAL_ALLOC])) delete tmp; //存在的对象技术减一 _objectCount--; } }
接下来,我将介绍如何使用这个对象池,使用方法具体分为以下: 1、创建对象池,指定对象池中对象的类型和与分配对象的数目。 2、如果需要获取对象,调用对象池的ObtainObject获取对象obj。 3、使用完对象obj,调用ReleaseObject释放obj到对象池中。 4、如果不再需要对象池,调用Destruct ,释放SimpleObjectPool中的所有对象。 下面是具体代码:
Class SimpleObject { public: SimpleObject *poolListNext; Print(){ std::cout<<”invoke simpleobject”; } }; int main( void ) { SimpleObjectPool sop; SimpleObject *pso = sop. ObtainObject(); pso->Print(); sop. ReleaseObject(pso); sop. Destruct(); }
是不是很简单?下一章我将给出整个SimpleObjectPool的源代码。
上两章阐述了内存对象池的详细设计和使用,本章给出SimpleObjectPool的具体代码: 
     
     
/* INITIAL_ALLOC 为预申请对象数目*/ template class SimpleObjectPool { private: SimpleObjectPool(const SimpleObjectPool &); SimpleObjectPool& operator=(const SimpleObjectPool &); /*预申请对象*/ OBJECT _preAllocated[INITIAL_ALLOC]; OBJECT *_objectList; int _objectCount; public: SimpleObjectPool () : _objectList(NULL), _objectCount(INITIAL_ALLOC) { for(int i=0; i 0) { OBJECT *tmp = _objectList; _objectList = tmp->_poolListNext; // Don't delete preallocated objects if((tmp < &_preAllocated[0]) || (tmp >= &_preAllocated[INITIAL_ALLOC])) delete tmp; _objectCount--; } } /* 从对象池中获得对象 */ OBJECT *ObtainObject () { OBJECT *object; if(_objectList == NULL) { object = new OBJECT(); object->_poolListNext = NULL; _objectCount++; } else { object = _objectList; _objectList = object->_poolListNext; object->_poolListNext = NULL; } return object; } /*释放使用完的对象到对象池*/ void ReleaseObject (OBJECT *object) { object->_poolListNext = _objectList; _objectList = object; } };
同学们看了本篇关于内存池的介绍,是否觉得内存池其实很简单?如果有兴趣,您也可以实现一个比SimpleObjectPool更好的对象内存池!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值