const int MaxObjectNum = ;

    template <typename T>
class ObjectPool
{
template <typename... Args>
using Constructor = std::function<std::shared_ptr<T>(Args...)>;
public:
ObjectPool(void)
: m_bNeedClear(false)
{
} virtual ~ObjectPool(void)
{
m_bNeedClear = true;
} template <typename... Args>
void Init(size_t num, Args&&... args)
{
if (num <= || num > MaxObjectNum)
{
throw std::logic_error("object num out of range.");
} auto constructName = typeid(Constructor<Args...>).name(); for (size_t i = ; i < num; i++)
{
m_object_map.emplace(constructName,
std::shared_ptr<T>(new T(std::forward<Args>(args)...), [constructName, this]
(T* t)
{
if (m_bNeedClear)
{
delete t;
}
else
{
m_object_map.emplace(constructName, std::shared_ptr<T>(t));
}
}));
}
} template <typename... Args>
std::shared_ptr<T> Get()
{
string constructName = typeid(Constructor<Args...>).name(); auto range = m_object_map.equal_range(constructName); for (auto it = range.first; it != range.second; ++it)
{
auto ptr = it->second;
m_object_map.erase(it);
return ptr;
} return nullptr;
} private:
std::multimap<std::string, std::shared_ptr<T> > m_object_map;
bool m_bNeedClear; };

testmain.cpp

class BigObject
{
public:
BigObject(){} BigObject(int a){} BigObject(const int& a, const int& b)
{ } void Print(const string& str)
{
cout << str << endl;
} }; void Print(shared_ptr<BigObject> p, const string& str)
{
if (p != nullptr)
{
p->Print(str);
}
} int main()
{
ObjectPool<BigObject> pool;
pool.Init();
{
auto p = pool.Get();
Print(p, "p"); auto p2 = pool.Get();
Print(p2, "p2");
} auto p = pool.Get();
Print(p, "p"); auto p2 = pool.Get();
Print(p2, "p2"); auto p3 = pool.Get();
Print(p3, "p3"); pool.Init(, ); auto p4 = pool.Get<int>(); Print(p4, "p4");
getchar();
return ;
}

c++11 对象池的实现的更多相关文章

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

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

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

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

  3. Unity3d对象池

    Singleton.cs 12345678910111213 using UnityEngine;/// <summary>/// 单例模版类/// </summary>pub ...

  4. Java 基础 - 对象池

    对象池  优点:  防止过多的创建对象合理利用对象, 缺点: 会有线程阻塞 Demo 测试代码 package com.cjcx.pay.obj; import java.util.Enumerati ...

  5. JedisCluster中应用的Apache Commons Pool对象池技术

    对象池技术在服务器开发上应用广泛.在各种对象池的实现中,尤其以数据库的连接池最为明显,可以说是每个服务器必须实现的部分.   apache common pool 官方文档可以参考:https://c ...

  6. Python中小整数对象池和大整数对象池

    1. 小整数对象池 整数在程序中的使用非常广泛,Python为了优化速度,使用了小整数对象池, 避免为整数频繁申请和销毁内存空间. Python 对小整数的定义是 [-5, 256] 这些整数对象是提 ...

  7. commons.pool2 对象池的使用

    commons.pool2 对象池的使用 ? 1 2 3 4 5 <dependency>     <groupId>org.apache.commons</groupI ...

  8. 托管C++线程锁实现 c++11线程池

    托管C++线程锁实现   最近由于工作需要,开始写托管C++,由于C++11中的mutex,和future等类,托管C++不让调用(报错),所以自己实现了托管C++的线程锁. 该类可确保当一个线程位于 ...

  9. 【JVM】Java 8 中的常量池、字符串池、包装类对象池

    1 - 引言 2 - 常量池 2.1 你真的懂 Java的“字面量”和“常量”吗? 2.2 常量和静态/运行时常量池有什么关系?什么是常量池? 2.3 字节码下的常量池以及常量池的加载机制 2.4 是 ...

随机推荐

  1. 彻底解决tap“点透”,提升移动端点击响应速度

    申明!!!最后发现判断有误,各位读读就好,正在研究中.....尼玛水太深了 前言 近期使用tap事件为老夫带来了这样那样的问题,其中一个问题是解决了点透还需要将原来一个个click变为tap,这样的话 ...

  2. java 截屏 类似于 QQ截屏

    package com.sun.test; import java.awt.AWTException;import java.awt.BorderLayout;import java.awt.Colo ...

  3. javascript获取css中的样式值

    <body> <input type="button" id="btn" value="启动"/> <img ...

  4. POJ 3026 Borg Maze(Prim+BFS建邻接矩阵)

    ( ̄▽ ̄)" #include<iostream> #include<cstdio> #include<cstring> #include<algo ...

  5. Java IO 四大附加接口、try-with-resource

    Java IO 四大附加接口.try-with-resource @author ixenos 四大附加接口 Closeable.Flushable.Readable.Appendable Close ...

  6. 背包类问题解答——poj3624分析

    习题网址:http://poj.org/problem?id=3624 试题分析:该类题通过限定物品总数量.总质量:并且初始化每个物品的起始质量和一个量化的性质.最后求解最值的量化性质的值是多少的问题 ...

  7. Infix expression 计算 without '(' and ')'

    #include<iostream> #include<stack> #include<string> using namespace std; char comp ...

  8. Gentoo安装详解(五)-- 安装X桌面环境

    安装X桌面环境: 安装Xorg: 检测显卡信息: dmesg | grep video lspci | grep -i VGA 配置INPUT_DEVICE.VIDEO_CARDS变量: 在安装Xor ...

  9. 第二部分 职责型模式responsibility

    普通职责无法提供的内容,据此可以定义以下几种模式: 将职责集中到某个类的一个单独实例,单件模式 当一个对象发生改变时,依赖于这个对象的其他对象都能够得到通知,而这个发生改变的对象无须了解自己被其他哪些 ...

  10. 2.4 chrome 开发者工具

    开发者工具顶部有Elements.Console.Network等八个栏目.常用的有三个:Elements,用来查看需爬取字段的HTML标签信息:Console,可以检测你的JS代码:Network, ...