c++ 實現對象池

c++ 簡單實現一個管理對象池

ObjPool.h

#pragma once

#include <iostream>
#include <queue>
#include <memory>
using namespace std;

static constexpr int32_t pool_step = 3;
template<typename T>
class ObjPool
{
	using shared_obj_t = shared_ptr<T>;
	using pool_t = typename deque<shared_obj_t>;
public:
	// 程序啓動優先調用此函數
	static ObjPool<T>* Instance()
	{
		static ObjPool<T> pool;
		return &pool;
	}
	~ObjPool()
	{
		m_pool.clear();
	}
	template<typename... Args>
	void Init(Args&&... args)
	{
		m_count += pool_step;
		for (int32_t i=0;i< pool_step;i++)
		{
			auto pObj = shared_ptr<T>(new T(std::forward<Args>(args)...),[this](T* obj) {
				obj->Clear();
				m_pool.emplace_back(shared_ptr<T>(obj));
				});
				m_pool.emplace_back(pObj);
		}
	}
	template<typename... Args>
	shared_obj_t GetObj(Args&&... args)
	{
		if (m_pool.empty())
		{
			Init(args...);
		}
		auto obj = m_pool.front();
		m_pool.pop_front();
		return obj;
	}

	int32_t EmptySize()
	{
		return m_pool.size();
	}

	int32_t UseSize()
	{
		return (m_count - m_pool.size());
	}
private:
	pool_t m_pool;
	int32_t m_count{0};
};

測試代碼:

#include "ObjPool.h"

class User
{
public:
	User() {}
	~User() {}
	void Clear()
	{
		cout << "clear user resource" << endl;;
	}

private:
};

class User2
{
public:
	User2() {}
	User2(const std::string& str):m_str(str) {}
	~User2() {}
	void Clear()
	{
		cout << "clear user resource" << endl;
		cout << "str ==" << m_str << endl;
	}

private:
	std::string m_str;
};

int main()
{
	auto user_pool = ObjPool<User>::Instance();
	auto pUser = user_pool->GetObj();
	pUser = nullptr;
	cout << user_pool->EmptySize() << endl;

	auto pUser1 = user_pool->GetObj();
	auto pUser2 = user_pool->GetObj();
	auto pUser3 = user_pool->GetObj();
	auto pUser4 = user_pool->GetObj();
	cout << user_pool->EmptySize() << endl;
	cout << user_pool->UseSize() << endl;

	auto user2_pool = ObjPool<User2>::Instance();
	auto pUser5 = user2_pool->GetObj("AAAA");
	pUser5 = nullptr;
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章