`

深入浅出对象池(Object Pool)

    博客分类:
  • c++
 
阅读更多

在稍微大型一点的软件系统开发中,通常我们会用到内存池,对象池,线程池,连接池等各种各样的池(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>

 

分享到:
评论

相关推荐

    《Head First 深入浅出面向对象分析与设计》【带完整书签版】.pdf

    《深入浅出面向对象分析与设计(中文版)》将告诉你如何分析、设计以及撰写真正面向对象的软件:容易重用、好维护、可扩展的软件;不再使你心碎的软件;让你增添新功能而不会破坏旧机制的软件。你是否早已对市面上那些...

    深入浅出面向对象的分析与设计 完整版 PDF Head First Object-Oriented Design and Analysis.part3

    “《深入浅出面向对象分析与设计》对OOA&D这个主题的探讨令人耳目一新。 本书与众不同之处在于它将焦点摆在学习上,本书的诸位作者让从业人员对OOA&D的内涵不再感到遥不可及,而且它在实际工作中确实有用。”  ...

    改进 boost::object_pool 内存池效率问题。

    相信不少人听过 boost 委员会提过 boost 里的对象池设计存在缺陷。我花了一些时间研究它的实现,发现其在效率上确实存在严重问题。这里给出一套解决方案。在效率上有了较大提高。可以完全替换你项目里的 object_pool...

    UE4 Actor对象池插件

    3. `PoolManager.h` 和 `PoolManager.cpp`:这可能是整个对象池系统的管理类,负责全局的对象池配置和调度。 4. `ExampleUsage.cpp` 或 `DemoLevel`: 示例代码或演示关卡,展示了如何在实际项目中使用这个插件。 ...

    深入浅出面向对象的分析与设计 完整版 PDF Head First Object-Oriented Design and Analysis.part2

    “《深入浅出面向对象分析与设计》对OOA&D这个主题的探讨令人耳目一新。 本书与众不同之处在于它将焦点摆在学习上,本书的诸位作者让从业人员对OOA&D的内涵不再感到遥不可及,而且它在实际工作中确实有用。”  ...

    Unity 工具类 之 简单的对象池管理类 ObjectPoolManager 实现

    Unity 工具类 之 简单的对象池管理类 ObjectPoolManager 实现 1、单例类,保证整个场景中只有一个类管理对象池; 2、把需要的对象以对象池形式管理起来,需要的时候 拿出来显示即可,不需要的时候隐藏以来即可; ...

    PoolManager对象池插件

    《PoolManager对象池插件详解及实战应用》 在Unity游戏开发中,高效管理资源是提升游戏性能的关键一环。PoolManager对象池插件正是为了实现这一目标而设计的,它通过复用游戏对象,避免频繁创建和销毁,极大地提高...

    深入浅出面向对象分析与设计.pdf

    面向对象分析(Object-Oriented Analysis,简称OOA)的目标是理解问题域,并从中抽象出对象模型。具体来说,OOA的主要目的包括: 1. **理解问题域**:通过分析业务需求和技术需求,深入了解系统需要解决的问题。 2....

    深入浅出面向对象的分析与设计 完整版 PDF Head First Object-Oriented Design and Analysis.part4

    “《深入浅出面向对象分析与设计》对OOA&D这个主题的探讨令人耳目一新。 本书与众不同之处在于它将焦点摆在学习上,本书的诸位作者让从业人员对OOA&D的内涵不再感到遥不可及,而且它在实际工作中确实有用。”  ...

    深入浅出面向对象分析与设计中文版

    本资源“深入浅出面向对象分析与设计中文版”旨在以易懂的方式引导读者理解和应用面向对象的思想。 面向对象编程(Object-Oriented Programming,OOP)是一种基于对象的编程范式,它以对象为中心,通过封装、继承和...

    深入浅出面向对象分析与设计(完整中文版)part2

    Head First Object-Oriented Analysis&Design中文完整版,学习面向对象设计的经典书籍。

    深入浅出JavaScript对象模型

    JavaScript中的对象 ECMA262规范一直在强调,“ECMAScript是一种基于对象(Object—Based)的语言,而不是传统的面向对象(Object—Oriented)的语言”。相信绝大多数人不会清楚这句话是什么意思。我想我们可以把它...

    深入浅出 Hibernate.pdf

    根据提供的标题“深入浅出 Hibernate.pdf”以及描述“深入浅出 Hibernate.pdf”,我们可以推断这份文档主要讲解了Hibernate框架的相关知识。接下来,我们将基于这些信息展开详细的解释与知识点的梳理。 ### ...

    深入浅出ES6

    ECMAScript 是基于对象的:基本语言和宿主设施都由对象提供,ECMAScript ...对象是剩下的内置类型 Object 的成员;函数是可调用对象 (callable object)。方法 (method) 是通过属性与对 象关联的函数。

    Object Pool-Demo

    通过阅读源码,你可以深入理解对象池的实现细节,如如何管理对象的状态,如何扩展和收缩池的大小,以及如何优化对象的分配和回收流程。 五、项目结构 - `Assembly-CSharp-firstpass.csproj`:这是Unity项目的编译...

    深入浅出面向对象的分析与设计,Head.First.Object-Oriented.Design

    深入浅出面向对象的分析与设计,Head.First.Object-Oriented.Design

    深入浅出MFC(PDF)

    《深入浅出MFC》是一本专为程序员设计的详细指南,主要讲解Microsoft Foundation Classes (MFC) 库的使用和开发技术。MFC是微软公司提供的一个C++类库,它封装了Windows API,使得开发者能用面向对象的方式来编写...

    Object Pool 简单实现

    对象池(Object Pool)是一种设计模式,用于管理对特定类型对象的创建和复用,以减少频繁创建和销毁对象带来的开销。在某些场景下,如游戏开发、数据库连接管理和线程池等,对象的创建和销毁过程可能非常耗时,这时...

    深入浅出Java 2面向对象程序设计(PDG)

    《深入浅出Java 2面向对象程序设计》是一本针对Java编程初学者和进阶者的重要教程,旨在帮助读者深入理解和掌握面向对象编程的核心概念和技术。面向对象编程(Object-Oriented Programming,简称OOP)是Java语言的...

Global site tag (gtag.js) - Google Analytics