c++对象池使用
//
// 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++对象池使用的更多相关文章
- 设计模式之美:Object Pool(对象池)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):实现 DatabaseConnectionPool 类. 实现方式(二):使用对象构造方法和预分配方式实现 ObjectPool ...
- Egret中的对象池ObjectPool
为了可以让对象复用,防止大量重复创建对象,导致资源浪费,使用对象池来管理. 对象池具体含义作用,自行百度. 一 对象池A 二 对象池B 三 字符串key和对象key的效率 一 对象池A /** * 对 ...
- 对象池与.net—从一个内存池实现说起
本来想写篇关于System.Collections.Immutable中提供的ImmutableList里一些实现细节来着,结果一时想不起来源码在哪里--为什么会变成这样呢--第一次有了想写分析的源码 ...
- 通用对象池ObjectPool的一种简易设计和实现方案
对象池,最简单直接的作用当然是通过池来减少创建和销毁对象次数,实现对象的缓存和复用.我们熟知的线程池.数据库连接池.TCP连接池等等都是非常典型的对象池. 一个基本的简易对象池的主要功能实现我认为应该 ...
- paip.提升性能----数据库连接池以及线程池以及对象池
paip.提升性能----数据库连接池以及线程池以及对象池 目录:数据库连接池c3po,线程池ExecutorService:Jakartacommons-pool对象池 作者Attilax 艾龙, ...
- common-pool2对象池(连接池)的介绍及使用
我们在服务器开发的过程中,往往会有一些对象,它的创建和初始化需要的时间比较长,比如数据库连接,网络IO,大数据对象等.在大量使用这些对象时,如果不采用一些技术优化,就会造成一些不可忽略的性能影响.一种 ...
- javascript设计模式学习之四——单例模式,缓存与对象池
单例模式的定义:确保一个实例,并提供全局访问. 惰性单例的定义:只在需要的时候才创建对象. 在开发中,有些对象往往只需要一个,比如线程池.全局缓存.浏览器中的window对象等. java中的单例 关 ...
- Unity3D 基于预设(Prefab)的泛型对象池实现
背景 在研究Inventory Pro插件的时候,发现老外实现的一个泛型对象池,觉得设计的小巧实用,不敢私藏,特此共享出来. 以前也看过很多博友关于对象池的总结分享,但是世界这么大,这么复杂到底什么样 ...
- 深度剖析C++对象池自动回收技术实现
http://www.tuicool.com/articles/mQBfQfN 对象池可以显著提高性能,如果一个对象的创建非常耗时或非常昂贵,频繁去创建的话会非常低效.对象池通过对象复用的方式来避免重 ...
- Apache Commons-pool实现对象池(包括带key对象池)
Commons-pool是一个apache开源组织下的众多项目的一个.其被广泛地整合到众多需要对象池功能的项目中. 官网:http://commons.apache.org/proper/common ...
随机推荐
- sql语句的优化分析
开门见山,问题所在 sql语句性能达不到你的要求,执行效率让你忍无可忍,一般会时下面几种情况. 网速不给力,不稳定. 服务器内存不够,或者SQL 被分配的内存不够. sql语句设计不合理 没有相应的索 ...
- jquery 拖拽,框选的一点积累
拖拽draggable,框选 selectable,按ctrl多选,临近辅助对齐,从工具栏拖工具 等,和jqueryui的selectable不同,是在一个父div里框选子div(类似框选文件),一 ...
- vue小总结
以下是我在使用vue过程中自己对vue的一些小总结,希望对学习vue的亲们能有所帮助: 1. http的post请求: this.$http({url: '/someUrl', method: ' ...
- Java 8新特性-2 接口定义增强
为了解决当原有的接口中方法不足时,向原有的接口中添加新的方法,该接口下的N多实现类也需要重写该方法的问题!Java8引入了接口定义增强概念! Java8 打破了原有的接口的方法定义: 公共的.抽象的 ...
- Rust初步(七):格式化
在Rust中,如果要进行屏幕输出,或者写入到文件中,需要对数据进行格式化.这一篇总结一下它所支持的几种格式化方式. 这篇文章参考了以下官方文档,不过,按照我的风格,我还是会突出于C#语言的比较,这样可 ...
- MySQL常见错误
1. TokuFT file system space is really low and access is restricted 解决方法:修改tokudb_fs_reserve_percent参 ...
- Word基础
1.页面设置 默认大小A4,长宽比0.618 页面布局 2.字体设置 选择要设置的字体->右键->字体 3.选择性粘贴 4.段落设置 选择文字->右键->段落 5.表格 =SU ...
- OpenFlow消息
☞Openflow消息总共分为三大类: 1.Controller‐to‐Switch 控制器至交换机消息此类消息由控制器主动发出 Features 用来获取交换机特性 Con ...
- TreeView控件使用
treeView1.SelectedNode = treeView1.Nodes[0]; //选中当前treeview控件的根节点为当前节点添加子节点: TreeNode tmp; tmp = n ...
- ThinkPHP学习(二)
开发规范 1.命名规范 使用ThinkPHP开发的过程中应该尽量遵循下列命名规范: 特例:在ThinkPHP里面,有一个函数命名的特例,就是单字母大写函数,这类函数通常是某些操作的快 捷定义,或者有特 ...