C++实现简单的对象池

对象池的实现其实是非常简单的

思想也是很简单的:

用一个队列来存放所有的对象,需要时get一个对象,从队列头取一个对象,当用完后,重新将该对象投入到队列尾部。

#ifndef OBJ_POOL_H_
#define OBJ_POOL_H_

#include <queue>
#include <memory>
#include <stdexcept>

using std::queue;
using std::shared_ptr;

template <typename T>
class ObjPool{

public:
		ObjPool(int size=defaultSize) throw(std::invalid_argument,std::bad_alloc){
			if(0==size){
				throw std::invalid_argument("size can't not small than zero");
			}

			mSize=size;
			allocateChunk();

		}

		shared_ptr<T> getObj(){
			if(freeList.empty()){
				allocateChunk();
			}

			auto obj=freeList.front();
			freeList.pop();
			return obj;
		}

		void releaseObj(shared_ptr<T> obj){
			freeList.push(obj);
		}

protected:

		queue<shared_ptr<T>> freeList;

		int mSize;

		static const int defaultSize=30;

		void allocateChunk(){
			for(int i=0;i<mSize;i++){
				freeList.push(std::make_shared<T>());
			}

		}

private:
		ObjPool(const ObjPool<T> &src)=delete;
		ObjPool<T> &operator=(const ObjPool<T> &rhs)=delete;

};

#endif

—————————————————————————————————————————————————————————————————

//写的错误或者不好的地方请多多指导,可以在下面留言或者点击左上方邮件地址给我发邮件,指出我的错误以及不足,以便我修改,更好的分享给大家,谢谢。

转载请注明出处:http://blog.csdn.net/qq844352155

author:天下无双

Email:[email protected]

2015-7-18

于广州天河荷光路

——————————————————————————————————————————————————————————————————

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-11 16:57:02

C++实现简单的对象池的相关文章

[译]Unity3D内存管理——对象池(Object Pool)

从一个简单的对象池类开始说起 对象池背后的理念其实是非常简单的.我们将对象存储在一个池子中,当需要时在再次使用,而不是每次都实例化一个新的对象.池的最重要的特性,也就是对象池设计模式的本质是允许我们获取一个“新的”对象而不管它真的是一个新的对象还是循环使用的对象.该模式可以用以下简单的几行代码实现: public class ObjectPool<T> where T : class, new() { private Stack<T> m_objectStack = new Sta

Unity 对象池的使用

在游戏开发过程中,我们经常会遇到游戏发布后,测试时玩着玩着明显的感觉到有卡顿现象.出现这种现象的有两个原因:一是游戏优化的不够好或者游戏逻辑本身设计的就有问题,二是手机硬件不行.好吧,对于作为程序员的我们只能从第一个原因着手了,那就开始对着Profiler看性能开销,接下来就开始做各种内存,特效,代码上的优化了.对于这种问题,有经验的开发者在一开始就会做一个规范的设计,就我们的项目而言,设计时包含了角色池,怪物池,特效池,经验池,伤害池......所谓的对象池就是尽可能的复用内存中已经驻留的资源

对象池方案总结

最近项目涉及到大量数据并发的问题,短时间内会产生和销毁大量对象,因此担心会不会影响系统的性能,考虑使用对象池的方案. 但是在对对象池的学习中,对于是否使用对象池产生的疑问. MSDN中 “How to: Create an Object Pool by Using a ConcurrentBag”(https://msdn.microsoft.com/en-us/library/ff458671.aspx)一文中提到 “Object pools can improve application p

设计模式之对象池模式

对象池模式 对象池模式, 或者称为对象池服务, 其意图为: 通过循环使用对象, 减少资源在初始化和释放时的昂贵损耗(这里的"昂贵"可能是时间效益(如性能), 也可能是空间效益(如并行处理), 在大多情况下, 指性能) 简单的说, 在需要时,从池中提取,不用时,放回池中,等待下一个请求. 典型的例子是连接池和线程池. 类图如下: 其中角色如下: ObjectPool 对象池角色: 提供对象池, 其中有两个公共方法, checkOut负责从池中提取对象, checkIn负责回收对象(很多时

Unity程序优化之对象池

对于做程序的朋友来说优化是一个避免不了的话题,对于程序的优化可以从两个方面来入手,一个是CPU方面的优化,一个是GPU的优化.对于CPU与GPU的作用简单理解的话你可以暂时当做CUP是处理计算的.GPU是处理渲染的,例如程序中的一些计算啊逻辑处理啊都是有CPU来处理的,,我们程序的显示啊,特效等一切看到的东西都是GPU来处理的.当然他们的关系不单单如此,扯远了哈,我们这篇博客主要讲CPU优化方面的对象池技术.对象池大家应该都听说过,它主要应用于处理需要大量重复利用的资源的,因为如果有很多资源如果

游戏编程模式-对象池

“使用固定的对象池重用对象,取代单独的分配和释放对象,以此来达到提升性能和优化内存使用的目的.” 动机 假设我们正在致力于游戏的视觉效果优化.当英雄释放魔法时,我们想让一个火花在屏幕上炸裂.这通常需要一个粒子系统(一个用来生成大量小的图形并在它们生存周期产生动画的引擎)来实现.而这个粒子系统实现这个火花的时候会产生大量的粒子,我们需要非常快速的创建这些粒子同时在这些粒子“死亡”的时候释放这些粒子对象.在这里,我们会碰到一个严重的问题——内存碎片化. 碎片化地害处 为游戏和移动设备编程在很多方面都

对象池ObjectPool的简单实现

我对对象池的简单理解:当一个游戏需要产生大量游戏物体又需要频繁销毁时,可用一个对象池将游戏物体存储起来.目的是优化内存. 以下两篇我参考过觉得OK的博文: https://blog.csdn.net/u013236878/article/details/52443066 https://www.jianshu.com/p/6133fb7e0819 unity内简单实现一下: 1.canvas下新建空物体命名为07_ObjectPool,新建一个cube 2.创建一个脚本,内容如下,挂载在空物体上

对象池的简单实现

1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 5 public class GameInstatie : MonoBehaviour { 6 7 private Stack<GameObject> GameManager = new Stack<GameObject>();//未激活怪我的对象池 8 private Stack<GameObject&

对象池的简单使用

using System.Collections; using System.Collections.Generic; using UnityEngine; public class DemoPool : MonoBehaviour { //要实例的物体 public GameObject monsterPrefab; //存放物体的对象池 未激活 private List<GameObject> monsterList = new List<GameObject>(); //激活