浅析对象池
来源:互联网 发布:linux笔试题面试题 编辑:程序博客网 时间:2024/06/07 10:05
在稍微大型一点的软件系统开发中,通常我们会用到内存池,对象池,线程池,连接池等各种各样的池(Pool),本文就来讲一讲对象池(Object Pool)。下面从四个方面来介绍一下对象池:
1.什么是对象池(Object Pool) ?
池(Poo), 与集合在某种意义上有些相似。 水池,是一定数量的水的集合;内存池,是一定数量的已经分配好的内存的集合;线程池,是一定数量的已经创建好的线程的集合。那么,对象池,顾名思义就是一定数量的已经创建好的对象(Object)的集合。
2.对象池是干什么的?
举个生活中水池的例子,在没有水池的时候,每次用水,都要去很远的地方挑水;有了水池之后的,一次挑很多水来,放在水池蓄下来,这样以后的一段时间内,用水的时候就不用去挑了,直接从水池取就可以了。同样的道理,在C/C++的程序中,如果一种对象,你要经常用malloc/free(或new/delete)来创建、销毁,这样子一方面开销会比较大,另一方面会产生很多内存碎片,程序跑的时间一长,性能就会下降。这个时候,就产生了对象池。可以事先创建好一批对象,放在一个集合中,以后每当程序需要新的对象时候,都从对象池里获取,每当程序用完该对象后,都把该对象归还给对象池。这样,就会少了很多的malloc/free(new/delete)的调用,在一定程度上提高了系统的性能,尤其在动态内存分配比较频繁的程序中效果较为明显。
3.对象池有什么特征?
一般来说,对象池有下面几个特征:
(1)对象池中有一定数量已经创建好的对象
(2)对象池向用户提供获取对象的接口,当用户需要新的对象时,便可通过调用此接口获取新的对象。如果对象池中有事先创建好的对象时,就直接返回给用户;如果没有了,对象池还可以创建新的对象加入其中,然后返回给用户
(3)对象池向用户提供归还对象的接口,当用户不再使用某对象时,便可通过此接口把该对象归还给对象池
4.怎么实现一个对象池?
下面是一个对象池的C++简单实现,感兴趣的朋友可以自己研究一下,由于程序比较简单,在这里,我就不再说明了。
#include <list> template<typename Object>class ObjectPool{public: ObjectPool(size_t unSize) : m_unSize(unSize) { for (size_t unIdx = 0; unIdx < m_unSize; ++ unIdx){ m_oPool.push_back(new Object());} } ~ObjectPool() {typename std::list<Object *>::iterator oIt = m_oPool.begin();while (oIt != m_oPool.end()){delete (*oIt);++ oIt;}m_unSize = 0; } Object * GetObject() { Object * pObj = NULL; if (0 == m_unSize) { pObj = new Object(); } else { pObj = m_oPool.front(); m_oPool.pop_front(); -- m_unSize; } return pObj; } void ReturnObject(Object * pObj) { m_oPool.push_back(pObj); ++ m_unSize; } private: size_t m_unSize; std::list<object *> m_oPool;};</object></typename></list>
本文固定链接:http://www.wuzesheng.com/?p=674
- 浅析对象池
- java 浅析对象池ThreadPool
- 浅析对象
- 浅析Response对象&&Request对象
- Geometry 对象浅析
- Geometry对象浅析
- 浅析windows对象管理
- 面向对象浅析
- 事务对象浅析?
- 浅析XMLHttpRequest 对象
- 浅析面向对象
- LUA面向对象浅析
- 对象内存模型浅析
- 类与对象浅析
- 浅析JavaScript面向对象
- BOM对象浅析
- Java面向对象浅析
- Geometry 对象浅析
- 使用PHP 给网站 生成快照图片和缩略图
- 好书
- command_type
- 华为牛人的十年工作感悟
- 金币阵列问题
- 浅析对象池
- Boxplot(盒图)
- Cookie工作过程
- Struts下载权限控制
- 打开目录里的文件时,按文件名顺序
- hessianPHP中文乱码解决
- Linux sudo
- WinServer2008 流媒体服务(WMS)外网访问解决方法(原创)
- addSubview和insertSubview的区别