boost内存池使用

本文介绍了一个C++内存池的实现,包括`boost::pool`的使用,以及如何用内存池管理不同类型的对象。示例中展示了如何创建`Custom`和`Custom1`对象,并通过内存池分配内存,提高效率。同时,提供了多个模板函数来处理不同数量的构造参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#pragma once
#include <string>
#include <iostream>

using namespace std;

class Custom
{
public:
	Custom(int id);
	~Custom();
	int getid();
private:
	int m_id{ 0 };	
};

class Custom1
{
public:
	//如果使用boost_object管理内存,受限于boost的实现这里的参数个数不要超过4个
	Custom1(int id, string str, int id2)	
		: m_id(id)
	{
	};
	~Custom1() {};
	int getid();
private:
	int m_id{ 0 };
};
#include "Custom.h"

Custom::Custom(int id)
{
	m_id = id;
}

Custom::~Custom()
{
}

int Custom::getid()
{
	return m_id;
}

int Custom1::getid()
{
	return m_id;
}
#pragma once
#include "boost/pool/pool.hpp"
#include "boost/pool/object_pool.hpp"
#include "boost/pool/singleton_pool.hpp"
#include <memory>

namespace wy {
	namespace custompool {
		static boost::pool<> localPool(sizeof(char));

		template<typename N, typename... Args>
		static boost::object_pool<N> localObjPool;

		//从全局单例内存池申请原始数据类型(线程安全)
		struct MyPoolTag{};
		template<typename T>
		static std::shared_ptr<void> wy_new_pod()
		{
			try
			{
				return std::shared_ptr<void>(boost::singleton_pool<MyPoolTag, sizeof(T)>::malloc());
			}
			catch (const std::bad_alloc&)
			{
				return nullptr;
			}
		}

		//从静态全局线程池申请原始数据类型对象(非线程安全)
		static std::shared_ptr<void> wy_new_pod_fast()
		{
			return std::shared_ptr<void>(localPool.malloc());
		}

		//申请静态全局内存池申请类对象(非线程安全)
		template<typename T, typename... Args>
		static std::shared_ptr<T> wy_new(Args... args) 
		{
			try
			{
				return std::shared_ptr<T>(localObjPool<T>.construct(std::forward<Args>(args)...));
			}
			catch (const std::bad_alloc&)
			{
				return nullptr;
			}		
		}
	}
}
// MemoryPool.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <vector>
#include "Custom.h"
#include "ClassPoolTemplate.h"

using namespace std;

const int g_dataSize = 10000;

template<typename T>
void func_pod_fast(vector<std::shared_ptr<T>>& v)
{
    for (int i=0; i < g_dataSize; ++i)
    {
		std::shared_ptr<T> t = std::static_pointer_cast<T>(wy::custompool::wy_new_pod_fast());
		*t = i;
        v.emplace_back(t);
    }
}

template<typename T>
void func_pod(vector<std::shared_ptr<T>>& v)
{
	for (int i = 0; i < g_dataSize; ++i)
	{
		std::shared_ptr<T> t = std::static_pointer_cast<T>(wy::custompool::wy_new_pod<T>());
		*t = i;
		v.emplace_back(t);
	}
}

//受限于boost的是现实,这里的可变参数个数不要超过四个
template<typename T, typename... Args>
void func(vector<std::shared_ptr<T>>& v, Args... args)
{
	for (int i = 0; i < g_dataSize; ++i)
	{
		std::shared_ptr<T> pT= std::static_pointer_cast<T>(wy::custompool::wy_new<T>(i, std::forward<Args>(args)...));
		v.emplace_back(pT);
	}
}

int main()
{
	vector<std::shared_ptr<int>> v;
	vector<std::shared_ptr<double>> v1;
	vector<std::shared_ptr<Custom>> v3;
	vector<std::shared_ptr<Custom1>> v4;
	while (true)
	{
		//singleton_pool	
		func_pod<int>(v);
		for (auto item : v)
		{
			cout << *item << " ";
		}

		cout << "---------------------------------------------------------------\n ";

		//pool
		func_pod_fast(v1);
		for (auto item : v1)
		{
			cout << *item << " ";
		}
        
		//object_pool	
		func<Custom>(v3);
		for (auto item : v3)
		{
			cout << item->getid() << " ";
		}
		cout << "---------------------------------------------------------------\n ";

		//object_pool	
		func<Custom1>(v4, "test", 0);
		for (auto item : v4)
		{
			cout << item->getid() << " ";
		}
		cout << "---------------------------------------------------------------\n ";
	}

    std::cout << "\nHello World!\n";
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_君莫笑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值