Boost开发指南-3.10singleton_pool

singleton_pool

singleton_pool与 pool的接口完全一致,可以分配简单数据类型(POD)的内存指针,但它是一个单件。

singleton_pool位于名字空间boost,为了使用singleton_pool组件,需要包含头文件<boost/pool/singleton_pool.hpp>,即:

cpp 复制代码
#include <boost/pool/singleton_pool.hpp>
using namespace boost;

singleton_pool 默认使用boost.thread 库提供线程安全保证,所以需要链接boost_thread库,如果不使用多线程,那么可以在头文件前定义宏 BOOST_POOL_NO_MT。

类摘要

cpp 复制代码
template <typename Tag, unsigned RequestedSize>
class singleton_ pool
{
public:
   static bool is_from(void * ptr);
   static void* malloc(); //分配内存
   static void* ordered_malloc();
   static void* ordered_malloc(size_type n);
   
   static void free(void * ptr); //归还内存
   static void ordered_free(void* ptr);
   static voidfree(void * ptr, std: : size_t n);
   static voidordered_free (void * ptr, size_type n);
   static bool release_memory(); //释放内存
   static bool purge_memory();
);

用法

singleton_pool主要有两个模板类型参数(其余的可以使用缺省值)。第一个Tag仅仅是用于标记不同的单件,可以是空类,甚至是声明(这个用法还被用于boost.exception)。第二个参数RequestedSize等同于 pool构造函数中的整数requested_size,指示pool分配内存块的大小。

singleton_pool 的接口与pool完全一致,但成员函数均是静态的,所以不需要声明singleton_pool 的实例。直接用域操作符::来调用静态成员函数。因为singleton_pool是单件,所以它的生命周期与整个程序同样长,除非手动调用release_memory()或purge_memory(),否则singleton_pool不会自动释放所占用的内存。除了这两点,singleton_pool的用法与pool完全相同。

cpp 复制代码
#define BOOST_POOL_NO_MT //不使用多线程
#include <boost/pool/singleton_pool.hpp>

struct pool_tag {}; //仅仅用于标记的空类
typedef singleton_pool<pool_tag, sizeof(int)> spl; //内存池定义

int main()
{
	int* p = (int*)spl::malloc(); //分配一个整数内存块
	assert(spl::is_from(p));
	spl::release_memory(); //释放所有未被分配的内存
} //spl的内存直到程序结束才完全释放,而不是退出作用域

singleton_pool在使用时最好使用typedef来简化名称,否则会使得类型名过于冗长而难以使用。如代码中所示:

cpp 复制代码
typedef singleton_pool<pool_tag,sizeof (int)> spl;

用于标记的类pool_tag可以再进行简化,直接在模板参数列表中声明tag类,这样可以在一条语句中完成对singleton_pool的类型定义,例如:

cpp 复制代码
typedef singleton_pool<struct pool_tag, sizeof (int)> spl;

代码示例

cpp 复制代码
#define BOOST_POOL_NO_MT
#include <boost/pool/singleton_pool.hpp>

struct pool_tag {};
typedef singleton_pool<pool_tag, sizeof(int)> spl;

void case4()
{
	int* p = (int*)spl::malloc();
	assert(spl::is_from(p));
	spl::release_memory();
}

int main()
{
	case4();
}
相关推荐
激流丶3 分钟前
【Kafka 实战】如何解决Kafka Topic数量过多带来的性能问题?
java·大数据·kafka·topic
神奇夜光杯5 分钟前
Python酷库之旅-第三方库Pandas(202)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
Themberfue7 分钟前
Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized
java·开发语言·线程·多线程·synchronized·
plmm烟酒僧9 分钟前
Windows下QT调用MinGW编译的OpenCV
开发语言·windows·qt·opencv
测试界的酸菜鱼20 分钟前
Python 大数据展示屏实例
大数据·开发语言·python
让学习成为一种生活方式24 分钟前
R包下载太慢安装中止的解决策略-R语言003
java·数据库·r语言
晨曦_子画29 分钟前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
Black_Friend38 分钟前
关于在VS中使用Qt不同版本报错的问题
开发语言·qt
南宫生1 小时前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法
希言JY1 小时前
C字符串 | 字符串处理函数 | 使用 | 原理 | 实现
c语言·开发语言