使用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_36toALCR0yGydSAkmeMB6YXpUeZjFGqP6jSjjKZ1j35C8YHWwLYun9pK5Ri2009 年 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++内存池、对象池相关推荐

  1. cocoscreator如何使用对象池-对象池使用详解

    使用对象池 在运行时进行节点的创建(cc.instantiate)和销毁(node.destroy)操作是非常耗费性能的,因此我们在比较复杂的场景中,通常只有在场景初始化逻辑(onLoad)中才会进行 ...

  2. 从入门到掉坑:Go 内存池/对象池技术介绍

    作者:deryzhou,腾讯 PCG 后台开发工程师 Go 中怎么实现内存池,直接用 map 可以吗?常用库里 GroupCache.BigCache 的内存池又是怎么实现的?有没有坑?对象池又是什么 ...

  3. Android 内存优化-对象池★

    1.对象池 内存优化不仅要防止内存泄露,也要注意频繁GC卡顿.内存抖动以及不必要的内存开销造成的内存需求过大或者内存泄露. 比如,如果有大量临时对象的创建该如何处理呢? 首先要确定问题发生的原因,对象 ...

  4. Netty源码剖析之内存池和对象池设计流程

    1.为什么需要池化内存 Netty 作为底层网络框架,为了更高效的网络传输性能,堆外内存(Direct ByteBuffer)的使用是非常高频的. 堆外内存在 JVM 之外,在有效降低 JVM GC ...

  5. Unity3D 内存优化(一)对象池

    一.定义: 关于U3D内存优化,一直是游戏开发者头疼的事情,由于在项目中我们会频繁地创建和销毁一些对象,例如:怪物模型或者是UI预设体,但是,部分对象在游戏中是会频繁出现的,例如战斗中的小怪物,假如每 ...

  6. Unity中对象池的使用

    unity中用到大量重复的物体,例如发射的子弹,可以引入对象池来管理,优化内存. 对象池使用的基本思路是: 将用过的对象保存起来,等下一次需要这种对象的时候,再拿出来重复使用.恰当地使用对象池,可以在 ...

  7. java timetasker_Java网络与多线程系列之1:实现一个简单的对象池

    前言 为什么要从对象池开始呢,先从一个网络IO操作的demo说起 比如下面这段代码,显而易见已经在代码中使用了一个固定大小的线程池,所以现在的重点在实现Runnble接口的匿名对象上,这个对象每次创建 ...

  8. android+对象池使用,Android开发中对高并发对象池的重复利用

    这两天在整理一套Android的路由框架,在整理的过程中,发现在路由消息传递过程中,传输载体类会大量的生成,对于这种载体类来说,他们本身是可重复利用的,并不需要大量的创建,大量的废弃,所以,我打算引入 ...

  9. commons.pool2 对象池的使用

    commons.pool2 对象池的使用 ? 1 2 3 4 5 <dependency>     <groupId>org.apache.commons</groupI ...

最新文章

  1. ICCV 2021 | 英伟达新研究:直接通过视频就能捕获3D人体动作!
  2. ApplicationContext||ApplicationContext与BeanFactory的区别||SpringContextUtil类的作用
  3. 谷歌大佬花了半年整理的Leetcode刷题笔记
  4. 安全和anti-sapm的HTML5效果如何
  5. zedboard板子上呼吸灯的实现(第一版)仿真代码的实现
  6. 7——1 shelve 模块
  7. HDU 5608 function(莫比乌斯反演 + 杜教筛)题解
  8. uniapp使用colorUI 组件
  9. 多机器人系统实验室汇总
  10. linux开启关闭网络指令
  11. python print文本和数字混合_详解Python中的文本处理
  12. 斗地主+三人+叫地主+作弊(可设置)+积分属性+记牌器(可设置)
  13. (6.0系统手机)安卓神器Xposed框架ROOT安装指南
  14. cookie httponly ajax,为什么jquery的.ajax()方法没有发送我的会话cookie?
  15. vue中使用(瀑布流)vue-waterfall-easy插件
  16. 【Oracle】并行等待之PX Deq: Table Q Normal
  17. 推荐几个高质量的程序员 B 站视频账号
  18. 还在为ElementUI的原生校验方式苦恼吗,快用享受element-ui-verify插件的快乐吧(待续)
  19. 嵌入式 课程设计指导书
  20. Tableau8——数据操作

热门文章

  1. IntelliJ IDEA 详细中文教程
  2. [ORACLE]删除表的purge用法
  3. Spring-data-redis + Lettuce 如何使用 Pipeline
  4. Unity-地图、格子的动态绘制(2D)
  5. mcp3208C语言程序,MCP3208 12位ADC与单片机的Proteus仿真
  6. 编程python自学课程_就算你是文科生,也能轻松自学编程——《Python 自学手册》正式上线...
  7. 羊了个羊爆火的模式分析
  8. void函数为什么还能返回(不能返回前面理解错误)
  9. Java 工程师核心基础修炼
  10. OpenCV DNN单张与多张图像的推断