IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++对象池 -> 正文阅读

[C++知识库]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 <functional>
#include <memory>
#include <list>
#include <typeinfo>
#include <iostream>

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

	template<class T>
	class SimpleObjectPool
	{
	public:
		using TypeCB = std::function<void(T*)>;

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

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

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

			std::unique_ptr<T, TypeCB> 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<std::unique_ptr<T>> objPool;
	};
}

main.cpp

static U::SimpleObjectPool<class DataBuffer> 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<DataBuffer>(new DataBuffer(1024)));
	}
}

int main(int argc, char* argv[])
{
	U::SimpleObjectPool<STA> pool;
	pool.Add(std::unique_ptr<STA>(new STA()));
	pool.Add(std::unique_ptr<STA>(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;
}

效果展示:

效果图

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-08-06 10:25:04  更:2022-08-06 10:26:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 12:48:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码