美文网首页
C++实现对象池

C++实现对象池

作者: krislyy_ | 来源:发表于2018-11-14 18:07 被阅读0次
//
// Created by krislyy on 2018/11/14.
//

#ifndef ALGORITHM_OBJECTPOOL_H
#define ALGORITHM_OBJECTPOOL_H

#include <vector>
#include <memory>
#include <functional>

template<typename T>
class ObjectPool
{
public:
    using DeleterType = std::function<void(T*)>;

    void add(std::unique_ptr<T> t)
    {
        m_pool.emplace_back(std::move(t));
    }

    std::unique_ptr<T, DeleterType> get()
    {
        if (m_pool.empty())
        {
            throw std::logic_error("No more object");
        }

        std::unique_ptr<T, DeleterType> ptr(m_pool.back().release(), [this](T* t)
        {
            m_pool.emplace_back(std::unique_ptr<T>(t));
        });

        m_pool.pop_back();
        return std::move(ptr);
    }

    std::shared_ptr<T> getShared()
    {
        if (m_pool.empty())
        {
            throw std::logic_error("No more object");
        }

        auto pin = std::unique_ptr<T>(std::move(m_pool.back()));
        m_pool.pop_back();

        return std::shared_ptr<T>(pin.release(), [this](T* t)
        {
            m_pool.emplace_back(std::unique_ptr<T>(t));
        });
    }

    bool empty() const
    {
        return m_pool.empty();
    }

    std::size_t size() const
    {
        return m_pool.size();
    }

private:
    std::vector<std::unique_ptr<T>> m_pool;
};

#endif //ALGORITHM_OBJECTPOOL_H

测试案例

template <typename T>
class Object
{
    T data;
public:
    Object(T n) : data(n){
    }
    void print()
    {
        std::cout << "Hello world: " << data << std::endl;
    }
};

void checkObjectPool() {
    typedef Object<int> ObjectInt;
    ObjectPool<ObjectInt> pool;
    pool.add(std::unique_ptr<Object<int>>(new Object<int>(1)));
    pool.add(std::unique_ptr<Object<int>>(new Object<int>(2)));
    std::cout << "Object pool size: " << pool.size() << std::endl;
    {
        auto obj = pool.get();
        obj->print();
        {
            auto obj2 = pool.get(); //随即就被释放了
        }
        std::cout << "Object pool size: " << pool.size() << std::endl;
    }
    std::cout << "Object pool size: " << pool.size() << std::endl;
}

相关文章

  • C++实现对象池

    测试案例

  • 内存池

    参考资料 C++内存池介绍与经典内存池的实现 C++ 应用程序性能优化,第 6 章:内存池 linux c++ 内...

  • Netty对象池

    在平时工作中,听说和使用过连接池,线程池等.还有一种就是对象池,可以实现对象复用的功能. 当然实现对象池的方式手段...

  • Unity 学习笔记

    Unity 对象池实现方案:

  • 游戏框架与组件(1):对象池

    本文介绍了对象池以及对象池的代码实现。 本文链接游戏框架与组件(1):对象池[https://www.jiansh...

  • commons-pool2 池化技术探究

    一、前言 我们经常会接触各种池化的技术或者概念,包括对象池、连接池、线程池等,池化技术最大的好处就是实现对象的重复...

  • OC内存管理-自动释放池

    一、自动释放池简介 对于autoreleasepool是怎么实现的呢?直接xcrun查看下对应的c++实现: 可以...

  • iOS OC对象总结

    OC的实现 OC的对象、类主要是基于C、C++的结构体来实现的。编写的 OC代码,底层实现其实都是C、C++代码。...

  • oc对象本质

    OC代码底层实现都是c/c++,oc的类和对象都是基于c/c++的结构体实现的 1.nsobject的底层实现就是...

  • Netty之Recycler

    Recycler用来实现对象池,其中对应堆内存和直接内存的池化实现分别是PooledHeapByteBuf和Poo...

网友评论

      本文标题:C++实现对象池

      本文链接:https://www.haomeiwen.com/subject/ryajfqtx.html