栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

C++对象池

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++对象池

C++对象池

参考链接:https://blog.csdn.net/gx864102252/article/details/81174993

概念

  顾名思义,对象池就是用于预先存放一堆对象的池子,思路如下:

  1. 预先初始化创建一系列对象(或者从外部加载创建)。
  2. 从对象池中取出一个对象。
  3. 使用完之后自动回收自对象池。

  对象池有很多场景都可以使用,例如:一个对象构造很消耗时间,又或者一些对象被很频繁地使用和销毁(内存碎片),都可以使用对象池。它的思想类似于数据库连接池、网络句柄连接池等。

  在C++中借助智能指针,可以很方便的实现一个对象池,智能指针提供的方法可以自定义删除器,在智能指针需要释放的时候调用删除器,将对象重新放入对象池即可。

  这里关键要注意:

  1. 自定义删除器(需要重新压入构建的对象池)
  2. shared_ptr或者unique_ptr
细节

  自定义删除器只做一件事,就是将对象重新放入对象池。如果对象池初始化的时候就自定义删除器的话,那么在放回的时候是无法再定义一个这样的删除器的(删除器中的逻辑是将对象放回对象池),所以这种做法行不通。

  需要注意,回收的对象只能是默认删除器本身(智能指针指向的对象)。除了前述原因之外,另外一个原因是对象池释放的时候需要释放所有的智能指针,释放的时候如果存在自定义删除器将会导致对象无法释放。

  只有在Get的时候定义删除器才行,但是初始创建或加入的智能指针是默认删除器,所以我们需要把智能指针的默认删除器改为自定义删除器。

代码实现

SimpleObjectPool.hpp

#pragma once
#include 
#include 
#include 
#include 
#include 

namespace U
{
	template
	const char* UGetClassName()
	{
		const char* pName = typeid(T).name();
		return pName;
	}

	template
	class SimpleObjectPool
	{
	public:
		using TypeCB = std::function;

		void Add(std::unique_ptr t)
		{
			objPool.push_back(std::move(t));
		}

		std::unique_ptr Get()
		{
			std::function funcCB = [this](T* t)->void {
				objPool.push_back(std::unique_ptr(t));
				std::cout << "删除缓冲区" << std::endl;
			};

			if (objPool.empty())
			{
				Add(std::unique_ptr(new T(1024)));//新增空间
			}

			std::unique_ptr ptr(objPool.back().release(), funcCB);
			objPool.pop_back();//删除最后一个被释放的unique_ptr
			return std::move(ptr);
		}

		bool Empty() const
		{
			return objPool.empty();
		}

		int CurSize() const
		{
			return objPool.size();
		}

		~SimpleObjectPool()
		{
			while (!objPool.empty())
			{
				objPool.back().reset();
				objPool.pop_back();
			}
		}
	private:
		std::list> objPool;
	};
}

main.cpp

static U::SimpleObjectPool g_objPool;//对象池

class DataBuffer
{
private:
	char* data;
	int len;
public:
	DataBuffer(int len)
	{
		data = new char[len];
		this->len = len;
	}

	~DataBuffer()
	{
		if (data != nullptr)
		{
			delete data;
			data = nullptr;
		}
	}

	char* const GetBuffer() const
	{
		return this->data;
	}

	int GetLen() const
	{
		return this->len;
	}
};

//测试对象
struct STA
{
	STA()
	{
		std::cout << "create" << endl;
	}
	STA(int i)
	{
		a = i;
		std::cout << "create int" << endl;
	}
	STA(const STA& other)
	{
		*this = other;
		std::cout << "copy" << endl;
	}
	~STA()
	{
		std::cout << "delete" << endl;
	}
	int a = 0;
};


void InitObjPool(int count)
{
	std::cout << "对象池初始化" << std::endl;
	for (int i = 0; i < count; i++)
	{
		g_objPool.Add(std::unique_ptr(new DataBuffer(1024)));
	}
}

int main(int argc, char* argv[])
{
	U::SimpleObjectPool pool;
	pool.Add(std::unique_ptr(new STA()));
	pool.Add(std::unique_ptr(new STA()));
	{
		auto ptr = pool.Get();
		pool.Get();
		cout << "pool size:" << pool.CurSize() << endl;
	}
	cout << "pool size:" << pool.CurSize() << endl;
	{
		pool.CurSize();
		pool.CurSize();
		cout << "pool size:" << pool.CurSize() << endl;
	}
	cout << "pool size:" << pool.CurSize() << endl;

	//InitObjPool(1024);
	system("pause");
	return 0;
}

效果展示:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1035159.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号