C++内存池、对象池

使用C/C++实现内存池技术
使用C/C++实现内存池技术
内存管理技术是开发多媒体应用和服务的很重要的知识。DMSP应用中会有频繁的缓冲区的创建和释放操作,这些操作会降低程序的运行效率和运行时间。本节在讲解内存池技术的同时,讲解对象的创建和使用方法。
内存池技术主要的思想是:被创建的缓冲区,在使用完后,并不立即释放,而是存放在一个空闲队列池中;当程序需要新的缓冲区时,首先从内存池中获取可用的缓冲区;在内存池中没有可用的缓冲区时,才去创建新的。通过这种内存池方法,可以减少频繁的缓冲区的创建和释放操作,减少内存碎片的发生,从而较有效的管理缓冲区。
内存池技术中,每一块内存被当作一个内存对象(IXBufferItem),这些对象可以管理自已的生成周期;同时,结合内存管理器对象(IXBufferManager)的管理功能,在内存对象需要被释放时,调用内存管理对象的相应接口(Reuse)通知管理对象自已需要被释放,讯问是否被再次利用,并根据返回的情况决定是释放自已,还是其他操作。
内存对象及其内存池管理对象被定义在下表中的源代码文件中。x_buffer_manager.h定义了内存对象和内存池管理对象,还定义了相关的操作函数组。
源文件x_buffer_manager.h:
转载
http://blog.csdn.net/qihuaheng/article/details/7185724#0-tsina-1-81510-397232819ff9a47a7b7e80a40613cfe1

C++中我们为什么提倡使用内存池技术?
转载
http://blog.csdn.net/liygcheng/article/details/17621993#0-tsina-1-87836-397232819ff9a47a7b7e80a40613cfe1

内存池技术
转载于
http://blog.csdn.net/qihuaheng/article/details/7185527#0-tsina-1-56614-397232819ff9a47a7b7e80a40613cfe1

C++ 应用程序性能优化—内存池技术
转载于
http://blog.csdn.net/qihuaheng/article/details/7185601#0-tsina-1-39285-397232819ff9a47a7b7e80a40613cfe1

基于策略的一种高效内存池的实现
转载于
http://blog.csdn.net/qihuaheng/article/details/7185638#0-tsina-1-74952-397232819ff9a47a7b7e80a40613cfe1

内存池(MemPool)技术详解
转载于
http://blog.csdn.net/qihuaheng/article/details/7185571#0-tsina-1-88748-397232819ff9a47a7b7e80a40613cfe1

C++ 内存池 – C++ Memory Pool
转载于
http://blog.csdn.net/liuchen1206/article/details/7165831#0-tsina-1-79542-397232819ff9a47a7b7e80a40613cfe1

内存池设计与实现
转载于
http://blog.csdn.net/shawngucas/article/details/6574863#0-tsina-1-7033-397232819ff9a47a7b7e80a40613cfe1

内存池的介绍与设计
转载于
http://blog.chinaunix.net/uid-20671208-id-4936127.html#0-tsina-1-67862-397232819ff9a47a7b7e80a40613cfe1

C++内存池对象池
http://download.csdn.net/download/muyelian/4020122

(原创)一个超级对象池的实现
http://www.cnblogs.com/qicosmos/p/3673723.html

编写高效的C++程序方法之使用对象池
http://blog.csdn.net/chaoyuan899/article/details/9018197

c++对象池内存池实现。
http://blog.sina.com.cn/s/blog_54384df801019ahp.html

深度剖析 C++ 对象池自动回收技术实现
http://blog.jobbole.com/95266/

一个通用并发对象池的实现
http://ifeve.com/generic-concurrent-object-pool/

简单C++对象池实现
http://www.cnblogs.com/good90/archive/2013/03/16/2963366.html

C++对象池
http://blog.csdn.net/ym19860303/article/details/8954489

对象池及数据库连接对象池
http://biancheng.dnbcw.info/c/47736.html

C++对象池技术实现 http://wenku.baidu.com/link?url=wMIsziz5IH3YfQ5tWnks2RaV-HqkMu29TCOP1zQIJ_3vsa9_36toALCR0yGydSAkmeMB6YXpUeZjFGqP6jSjjKZ1j35C8YHWwLYun9pK5Ri 这里写图片描述 2009 年 11 月 29 日 星期日 0:28 简单对象内存池设计图 来源:朱翔 同学们在开发中会发现其实 C++的对象分配—使用 new,需要花费很多时间,特别 对于那些需要频繁创建和释放对象的程序;更糟糕的是,随着时间的流逝,内存 将形成碎片,当它运行了很长时间,应用程序的运行越来越慢 本文我将介绍一种简单的内存对象池, ,来减少内存对象构造和释放的开销, 减少内存碎片,提高程序效率。上面是简单对象池设计图。 简单内存对象池的具体设计如下: 第一步:对象池是由对象链表_objectList 构成,对象必须拥有一个成员变 量_poolListNext,指向下一个对象。 第二步:为了提高效率,可以预申请一组对象 _preAllocated[INITIAL_ALLOC],下面是构造对象池的代码: SimpleObjectPool ()
_objectList(NULL),//初始化对象列表
_objectCount(INITIAL_ALLOC)//将对象池中对象的数目置为
INITIAL_ALLOC
{
//使用预分配的对象构造对象链表
for(int i=0; i
第三步:通过 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 更好的对象内存池!

一个C++的内存池和内存管理的实现(一)—- 分八个部分,很不错
http://blog.csdn.net/qiyao_2000/article/details/45100423

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值