//
// 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. Atitit.创业之uke团队规划策划 v9

    Atitit.创业之uke团队规划策划 v9 Uke  org prjAuthor撰写人:绰号:老哇的爪子( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努 ...

  2. Linux下安装Java环境配置步骤详述

    0.下载jdk8 登录网址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html选择对 ...

  3. Linux内核目录结构

    arch 包括所有和体系结构相关的核心代码. include 包括编译内核所需要的大部分头文件 init 包含内核的初始化代码(不是系统的引导代码),有main.c和Version.c两个文件 mm ...

  4. sizzle编译函数

    一个人去完成一件事情,如果派多个人去做的话,只要配合默契,效率比一个人做肯定要高,效率提高,所需的时间就减少了.如果只能一个人完成,那么必须设法提高自己的劳动效率,这个提高可以是量的改变也可以是质的改 ...

  5. Rust初步(四):在rust中处理时间

    这个看起来是一个很小的问题,我们如果是在.NET里面的话,很简单地可以直接使用System.DateTime.Now获取到当前时间,还可以进行各种不同的计算或者输出.但是这样一个问题,在rust里面, ...

  6. Android动画学习(二)——Tween Animation

    前两天写过一篇Android动画学习的概述,大致的划分了下Android Animation的主要分类,没有看过的同学请移步:Android动画学习(一)——Android动画系统框架简介.今天接着来 ...

  7. YII 的源码分析(二)

    上一篇简单分析了一下yii的流程,从创建一个应用,到屏幕上输出结果.这一次我来一个稍复杂一点的,重点在输出上,不再是简单的一行"hello world",而是要经过view(视图) ...

  8. Cesium应用篇:2影像服务(上)

    文章中相关范例下载路径:https://yunpan.cn/cByQqkANWN7Pu 访问密码 823d        Cesium中提供了多种ImageryProvider方式,来满足用户的实际需 ...

  9. Azure Backup (2) Azure备份服务

    <Windows Azure Platform 系列文章目录> 本文介绍的是国内由世纪互联运维的Azure China. 本文介绍的Azure管理界面是Classic Model,网址:h ...

  10. WCF学习系列四--【WCF Interview Questions – Part 4 翻译系列】

    WCF Interview Questions – Part 4   This WCF service tutorial is part-4 in series of WCF Interview Qu ...