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/#0-tsina-1-81510-ff9a47a7b7e80a40613cfe1







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

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

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

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

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

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

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

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

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

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

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

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/ym/article/details/

对象池及数据库连接对象池
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/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/230227.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月11日 上午9:01
下一篇 2026年3月11日 上午9:22


相关推荐

  • Python 打包成mac app

    Python打包成macapp一、创建一个简单的Tkinter应用,并命名为Sandwich.py:importsysifsys.version_info  #Python2  importTkinterastkelse:  #Python3  importtkinterast

    2022年4月12日
    327
  • hdu 1396

    hdu 1396递推,找规律#include#includeusingnamespacestd;intcount[510];intmain(){ count[1]=1; inti,j; for(i=2;i<=500;i++) { intt=count[i-1]; for(j=1;j<=i;j++)t=t+i+1-j; for(j=1;i-j>=j;j++)t=

    2022年8月12日
    7
  • 快速了解一下月之暗面开源的全球首个万亿参数级大模型 Kimi K2

    快速了解一下月之暗面开源的全球首个万亿参数级大模型 Kimi K2

    2026年3月12日
    3
  • 常见的测试用例设计方法7—因果图法

    常见的测试用例设计方法7—因果图法一 因果图法的定义因果图法是一种利用图解法分析输入的各种组合情况 从而设计测试用例的方法 他适合与检查程序输入条件的各种组合情况 二 因果图法的意义等价类划分和边界值分析方法都是着重考虑输入条件 但没有考虑输入条件的各种组合 输入条件之间的相互制约关系 这样虽然各种输入条件可能出错的情况已经测试测试到了 但多个输入条件组合起来可能出错的情况却被疏忽了 因果果图的基本约束约束 是指输入状态还存在这某种依赖关系 这种关系称作为约束 E 约束 异 表示 a b 两原因不会同

    2026年1月16日
    2
  • C语言程序设计第五版 谭浩强 第四章 课后习题 答案

    C语言程序设计第五版 谭浩强 第四章 课后习题 答案谭浩强 C 语言程序设计第五版第 4 章课后习题答案 1 什么是算术运算 什么是关系运算 什么是逻辑运算 答 算术运算时数学里基础的加减乘数求余数等 关系运算时求两个或者多个变量或者表达式之间的关系 逻辑运算时将多个变量或者表达式链接起来的逻辑关系 C 语言程序设计第五版课后答案谭浩强 2 C 语言中如何表示 真 和 假 系统如何判断一个量的 真 和 假 答 C 语言中将数值为 1 作为真 为 0 作

    2026年3月19日
    2
  • 数据请求:Ajax基础

    数据请求:Ajax基础Ajax 概述它是浏览器提供的一套方法 可以实现页面无刷新更新数据 提高用户浏览网站应用的体验 Ajax 的应用场景页面上拉加载更多数据列表数据无刷新分页表单项离开焦点数据验证搜索框提示文字下拉列表 Ajax 运行原理及实现 Ajax 运行原理 Ajax 相当于浏览器发送请求与接收响应的代理人 以实现在不影响用户浏览页面的情况下 局部更新页面数据 从而提高用户体验 Ajax 的

    2026年3月18日
    2

发表回复

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

关注全栈程序员社区公众号