C++内存池、对象池

C++内存池、对象池使用C/C++实现内存池技术使用C/C++实现内存池技术内存管理技术是开发多媒体应用和服务的很重要的知识。DMSP应用中会有频繁的缓冲区的创建和释放操作,这些操作会降低程序的运行效率和运行时间。本节在讲解内存池技术的同时,讲解对象的创建和使用方法。内存池技术主要的思想是:被创建的缓冲区,在使用完后,并不立即释放,而是存放在一个空闲队列池中;当程序需要新的缓冲区

使用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

今天的文章C++内存池、对象池分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/9339.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注