//
// ObjectPool.h
// DragonBall
//
// Created by user on 13-8-22.
//
// #include <iostream>
#include <vector>
#include "cocos2d.h"
#include <algorithm>
using namespace std;
using namespace cocos2d; template <typename T>
class ObjectPool{
public: ObjectPool(int initSize):m_initSize(initSize)
{
CCAssert(m_initSize >= , "m_initSize should >= 4");
allocate(initSize);
}; virtual ~ObjectPool()
{
for_each(m_usedList.begin(), m_usedList.end(), freeObject);
for_each(m_freeList.begin(), m_freeList.end(), freeObject);
} // 请求一个对象
T* request(){ //先检查空闲里面是否为空
if (m_freeList.size() == ) {
allocate(m_initSize/);
} T* t = m_freeList[];
m_freeList.erase(m_freeList.begin());
m_usedList.push_back(t);
return t;
}; // 放回一个对象到池里面
void putback(T* t)
{
for (int i = ; i < m_usedList.size(); ++i) {
if (t == m_usedList[i]) {
//找到此对象
m_usedList.erase(m_usedList.begin() + i);
m_freeList.push_back(t);return;
}
}
} //为了避免内存的不断增长,需要保持空间
void garbage()
{
//打印下大小
CCLog("m_usedList.size:%d",m_usedList.size());
CCLog("m_freeList.size:%d",m_freeList.size()); //如果空余的多余20则删除到初始化个数
if (m_freeList.size() > m_initSize) { typename vector<T*>::iterator it = m_freeList.begin();
int pIndex = ;
while (it != m_freeList.end()) { if (pIndex > m_initSize) {
T* t = (*it);
m_freeList.erase(it);
freeObject(t);
--it;
} ++pIndex;
++it;
}
}
} private: // 分配size个空间
void allocate(int size)
{
for (int i = ; i < size; ++i) {
T* t = new T;
m_freeList.push_back(t);
}
} static void freeObject(void* p)
{
T* t = (T*)p;
Ref* temp = (Ref*)t;
log("temp.ref : %d",temp->getReferenceCount());
delete t;
}
private: // 使用两个list一个用来放已经使用的,一个用来放未使用的
vector<T*> m_freeList;
vector<T*> m_usedList; // 初始容量
int m_initSize; };

使用的时候 先实例化

ObjectPool<T> * objectPool = new ObjectPool<T>(size);
auto pRet;
if(objectPool->request()){
pRet = objectPool->request();
}
else{
pRet = new T() ;
} pRet->remove();
objectPool->putBack(T);

c++对象池使用的更多相关文章

  1. 设计模式之美:Object Pool(对象池)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):实现 DatabaseConnectionPool 类. 实现方式(二):使用对象构造方法和预分配方式实现 ObjectPool ...

  2. Egret中的对象池ObjectPool

    为了可以让对象复用,防止大量重复创建对象,导致资源浪费,使用对象池来管理. 对象池具体含义作用,自行百度. 一 对象池A 二 对象池B 三 字符串key和对象key的效率 一 对象池A /** * 对 ...

  3. 对象池与.net—从一个内存池实现说起

    本来想写篇关于System.Collections.Immutable中提供的ImmutableList里一些实现细节来着,结果一时想不起来源码在哪里--为什么会变成这样呢--第一次有了想写分析的源码 ...

  4. 通用对象池ObjectPool的一种简易设计和实现方案

    对象池,最简单直接的作用当然是通过池来减少创建和销毁对象次数,实现对象的缓存和复用.我们熟知的线程池.数据库连接池.TCP连接池等等都是非常典型的对象池. 一个基本的简易对象池的主要功能实现我认为应该 ...

  5. paip.提升性能----数据库连接池以及线程池以及对象池

    paip.提升性能----数据库连接池以及线程池以及对象池 目录:数据库连接池c3po,线程池ExecutorService:Jakartacommons-pool对象池 作者Attilax  艾龙, ...

  6. common-pool2对象池(连接池)的介绍及使用

    我们在服务器开发的过程中,往往会有一些对象,它的创建和初始化需要的时间比较长,比如数据库连接,网络IO,大数据对象等.在大量使用这些对象时,如果不采用一些技术优化,就会造成一些不可忽略的性能影响.一种 ...

  7. javascript设计模式学习之四——单例模式,缓存与对象池

    单例模式的定义:确保一个实例,并提供全局访问. 惰性单例的定义:只在需要的时候才创建对象. 在开发中,有些对象往往只需要一个,比如线程池.全局缓存.浏览器中的window对象等. java中的单例 关 ...

  8. Unity3D 基于预设(Prefab)的泛型对象池实现

    背景 在研究Inventory Pro插件的时候,发现老外实现的一个泛型对象池,觉得设计的小巧实用,不敢私藏,特此共享出来. 以前也看过很多博友关于对象池的总结分享,但是世界这么大,这么复杂到底什么样 ...

  9. 深度剖析C++对象池自动回收技术实现

    http://www.tuicool.com/articles/mQBfQfN 对象池可以显著提高性能,如果一个对象的创建非常耗时或非常昂贵,频繁去创建的话会非常低效.对象池通过对象复用的方式来避免重 ...

  10. Apache Commons-pool实现对象池(包括带key对象池)

    Commons-pool是一个apache开源组织下的众多项目的一个.其被广泛地整合到众多需要对象池功能的项目中. 官网:http://commons.apache.org/proper/common ...

随机推荐

  1. Redux

    redux是Flux的一种实现方式,但还是和Flux有些不同. React控制视图层,要想做一个完整的数据流,必须要用react-redux. 官方demo,自己收集了一下: demo1http:// ...

  2. C#设计模式系列:开闭原则(Open Close Principle)

    1.开闭原则简介 开闭原则对扩展开放,对修改关闭,开闭原则是面向对象设计中可复用设计的基石. 2.开闭原则的实现 实现开闭原则的关键就在于抽象,把系统的所有可能的行为抽象成一个抽象底层,这个抽象底层规 ...

  3. 从零学java--传智播客

    java的输入需要引用Scanner包 import java.util.Scanner; class ScannerDemo{ public static void main(String[] ar ...

  4. AngularJS之WebAPi上传(十)

    前言 前面一系列我们纯粹是讲AngularJS,在讲一门知识时我们应该结合之前所学综合起来来做一个小的例子,前面我们讲了在MVC中上传文件的例子,在本节我们讲讲如何利用AngularJS在WebAPi ...

  5. jQuery的Internal DSL

    JQuery的核心理念是write less,do more(写的更少,做的更多),那么链式方法的设计与这个核心理念不谋而合.那么从深层次考虑这种设计其实就是一种Internal DSL. DSL是指 ...

  6. 使用karma测试平时写的小demo(arguments为例)

    有人说前端自动化测试非常困难,我觉得确实如此.在项目中,我个人也不放心写的测试,还是要手动测试.但是我们平时写demo学习时,完全可以使用自动化测试. 传统demo 1,新建一个html 2,写入js ...

  7. Last-Modified、If-Modified-Since 实现缓存和 OutputCache 的区别

    先梳理三个概念: OutputCache:页面输出缓存,一般 ASP.NET 应用程序会用到. Last-Modified:Http 响应头(Http Reponse Header),由服务器发给客户 ...

  8. 小菜学习Winform(四)MDI窗体(附示例)

    前言 在做winfrom项目的时候我们可能会用到嵌套窗体,就是说一个容器中有多个窗体,可以分别管理和应用这些窗体,.net中提供了一种机制就是MDI,可能大家都会用,这边就简单的介绍下. 简单应用 w ...

  9. Hive创建表格报【Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException】引发的血案

    在成功启动Hive之后感慨这次终于没有出现Bug了,满怀信心地打了长长的创建表格的命令,结果现实再一次给了我一棒,报了以下的错误Error, return code 1 from org.apache ...

  10. 记录一则数据库连接故障ORA-12560,ORA-12518

    环境:Win Server 2008 R2 + Oracle 11.2.0.1 故障:客户反映数据库连接不上,本机sysdba和网络连接都连接不上. 一.确认故障 1.1 服务器尝试sysdba登录 ...