//
// 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. iOS-App发布证书的申请与使用

    i开发环境:xcode5.1.1 iphonesdk:7.1 开发机器:iMac 真机部署测试:apple个人开发者ID 向导: 必备IDP证书和distribution证书(第一个证书是真机部署测试 ...

  2. iOS---runtime介绍

    本文目录 1.Runtime简介 2.Runtime相关的头文件 3.技术点和应用场景 3_1.获取属性\成员变量列表 3_2.交换方法实现 3_3.类\对象的关联对象,假属性 3_4.动态添加方法, ...

  3. Nginx配置文件解析

    user nginx nginx; #定义Nginx运行的用户和用户组 worker_processes 1; #nginx进程数,建议设置为等于CPU总核心数 worker_rlimit_nofil ...

  4. KnockoutJS 3.X API 第七章 其他技术(6) 使用“fn”添加自定义函数

    有时,您可能会通过向Knockout的核心值类型添加新功能来寻找机会来简化您的代码. 您可以在以下任何类型中定义自定义函数: 因为继承,如果你附加一个函数到ko.subscribable,它将可用于所 ...

  5. MongoDB 聚合操作

    在MongoDB中,有两种方式计算聚合:Pipeline 和 MapReduce.Pipeline查询速度快于MapReduce,但是MapReduce的强大之处在于能够在多台Server上并行执行复 ...

  6. 利用Bootstrap快速搭建个人响应式主页(附演示+源码)

    1.前言 我们每个程序员都渴望搭建自己的技术博客平台与他人进行交流分享,但使用别人的博客模板没有创意.做网站后台的开发人员可能了解前端,可是自己写一个不错的前端还是很费事的.幸好我们有Bootstra ...

  7. Sublime文件夹显示过滤

    Preferences/Setting-User添加如下命令: "file_exclude_patterns": ["*.mate", "*.gif& ...

  8. lua解释执行脚本流程

    #include "lua.hpp" #include <iostream> using namespace std; #pragma comment(lib, &qu ...

  9. MVC4做网站后台:栏目管理3、删除栏目与左侧列表菜单

    一.左侧列表菜单 打开视图Menu.cshtml,增加部分见红框 在category中添加脚本 //栏目菜单加载完毕函数 function CategoryMenu_Ready() { $('#cat ...

  10. ONE

    我是漆黑夜空中 闪烁凄凄的一颗星 遥隔千里的双眸一遇 看到了,你那藏在泪光里的话 你一个人 把泪擦干 把话捏在手心 陪着我,承受着黑夜的孤独 说明:来自落网的一个期刊<ONE>. 听这个期 ...