boost--内存池
boost的内存池实现了一个快速、紧凑的内存分配和管理器,使用它可以完全不用考虑delete释放问题。常用的boost内存池有pool、object_pool、singleton_pool。
1、pool
pool是一个简单的内存池类,它的模板类型通常使用默认的参数,构造函数的参数用来指定每次分配内存的大小,这个值可以通过成员get_requested_size()获得。
pool会根据需要自动向系统申请或归还使用的内存,在其析构的时候自动释放它持有的所有内存。常用的成员函数:
malloc():分配一块内存,返回类型为void*,内存分配失败返回NULL。
ordered_malloc():分配一块内存并合并空闲块链表,不推荐使用该函数,因为其效率低。
is_from():测试内存块是否属于本内存池。
free():释放malloc()非配的内存,不建议调用该函数来手动释放内存,因为pool是自动管理内存分配的。
release_memory():释放所有未被分配的内存。
purge_memory():强制释放pool持有的所有内存。
简单使用示例:
#include <iostream>
using namespace std; #include "boost\pool\pool.hpp"
using namespace boost; int main()
{
pool<> p1(sizeof(int)); int* p = (int*)p1.malloc();
*p = ;
cout << *p << endl; return ;
}
2、object_pool
object_pool是类实例的内存池,其模板类型的参数用来指定使用的类,其成员construct()用来分配一个类的对象,destroy()用来释放一个已分配的对象,is_from()用来测试对象是否属于本内存池分配的。
需要注意的三点:
①、默认情况下成员函数construct最多支持3个参数,可以对construct进行扩展以支持3个参数以上的构造函数,具体扩展方法可参见罗剑锋的《Boost程序库完全开发指南》一书。
②、object_pool的成员函数destroy()效率很低(原因可参考这篇文章http://blog.csdn.net/byxdaz/article/details/6153786),如果需要频繁释放已分配的对象的话谨慎考虑object_pool。
③、object_pool还提供了malloc()和free()成员,其可以像pool那样来分配和释放内存块。
简单实用示例:
#include <iostream>
#include <string>
using namespace std; #include "boost\pool\object_pool.hpp"
using namespace boost; int main()
{
object_pool<string> ops;
string* p = ops.construct("test");
cout << *p << endl; return ;
}
3、singleton_pool
singleton_pool是pool的线程安全版本,它是单例模式的,用户不用创建它,它可以保证在main函数运行之前就创建了单例。singleton_pool的模板类型参数有两个,其中 第一个可以是一个空类,第二个与pool的模板参数意义相同。
简单实用示例:
#include <iostream>
#include <string>
using namespace std; #include "boost\pool\singleton_pool.hpp"
using namespace boost; struct pool_tag {};
typedef singleton_pool<pool_tag, sizeof(int)> slp;
int main()
{
int* p = (int*)slp::malloc();
*p = ;
cout << *p << endl; return ;
}
boost--内存池的更多相关文章
- 重写boost内存池
最近在写游戏服务器网络模块的时候,需要用到内存池.大量玩家通过tcp连接到服务器,通过大量的消息包与服务器进行交互.因此要给每个tcp分配收发两块缓冲区.那么这缓冲区多大呢?通常游戏操作的消息包都很小 ...
- Boost内存池使用与测试
目录 Boost内存池使用与测试 什么是内存池 内存池的应用场景 安装 内存池的特征 无内存泄露 申请的内存数组没有被填充 任何数组内存块的位置都和使用operator new[]分配的内存块位置一致 ...
- 基于C/S架构的3D对战网络游戏C++框架_05搭建系统开发环境与Boost智能指针、内存池初步了解
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
- boost的线程池和内存池 智能指针
内存池为boost自带的 #include <boost/pool/pool.hpp> 或者另外一个开源的库: nedmalloc 一个高效率的库 线程池需要下载另外一个开源库 http: ...
- 定长内存池之BOOST::pool
内存池可有效降低动态申请内存的次数,减少与内核态的交互,提升系统性能,减少内存碎片,增加内存空间使用率,避免内存泄漏的可能性,这么多的优点,没有理由不在系统中使用该技术. 内存池分类: 1. ...
- boost之内存池
讲到内存池我们会想到对对象进行动态分配的过程new包含三个过程 1.使用operator new分配内存 2.使用placement new 初始化 3.返回内存地址. 分配内存可以分解成分配内存和获 ...
- nginx——内存池篇
nginx--内存池篇 一.内存池概述 内存池是在真正使用内存之前,预先申请分配一定数量的.大小相等(一般情况下)的内存块留作备用.当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续 ...
- 不定长内存池之apr_pool
内存池可有效降低动态申请内存的次数,减少与内核态的交互,提升系统性能,减少内存碎片,增加内存空间使用率,避免内存泄漏的可能性,这么多的优点,没有理由不在系统中使用该技术. 内存池分类: 1. ...
- 初识nginx——内存池篇
初识nginx——内存池篇 为了自身使用的方便,Nginx封装了很多有用的数据结构,比如ngx_str_t ,ngx_array_t, ngx_pool_t 等等,对于内存池,nginx设计的十分精炼 ...
- 常见C++内存池技术
原文:http://www.cppblog.com/weiym/archive/2013/04/08/199238.html 总结下常见的C++内存池,以备以后查询.应该说没有一个内存池适合所有的情况 ...
随机推荐
- 安装ORACLE高可用RAC集群11g执行root脚本的输出信息
安装ORACLE高可用RAC集群11g执行root脚本的输出信息 作者:Eric 微信:loveoracle11g [root@node1 ~]# /u01/app/oraInventory/orai ...
- Tomcat的简单归纳总结
2017年08月09日 12:39:23 大道之简 阅读数:1072 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/HcJsJqJSSM/ar ...
- luigi 学习
1.mac 上安装luigi pip install luigi pip install boto3 (luigi依赖 boto3) 2.基本概念 class Streams(luigi.Task): ...
- ActiveMQ(1)---初识ActiveMQ
消息中间件的初步认识 什么是消息中间件? 消息中间件是值利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成.通过提供消息传递和消息排队模型,可以在分布式架构下扩展进 ...
- 下载安装 STS(Spring Tool Suite),推荐对应 Eclipse 版本号,适用于Windows32位(xp、2003)
sts下载地址:https://spring.io/tools/sts/legacy 虽然sts内置了版本对应的eclipse,仍推荐使用当前环境下稳定使用的eclipse版本. Start 找到ec ...
- Flink架构、原理与部署测试(转)
Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时,提供支持流处理和批处理两种类型应用的功能. 现有的开源计算方案,会把流处理和批处理作为 ...
- 2.Yum仓库优化
1.[初始yum源备份]-[yum更换为国内源]-[添加epel扩展源] #!/bin/bash mkdir /etc/yum.repos.d/backup/ mv /etc/yum.repos.d/ ...
- 反射与特性与Tool编写
大多数程序都是用来处理数据的,他们读,写,操作和显示数据,图形也是一种数据. 程序员为某种目的创建和使用一些类型,因此,在设计时必须理解所使用类型的特性. 有关程序及其类型的数据被称为元数据,他们保存 ...
- 安装好ubuntu双系统启动时卡死解决办法
问题描述:在安装完ubuntu双系统后,第一次启动ubuntu系统时,卡死在启动界面(或者黑屏),这大概都是由于显卡驱动的原因,具体不在这里阐述,通过以下方法能成功解决,据我个人经验,这可能是诸多方法 ...
- Xshell 6安装与使用教程
随着xshell5出现评估期已过的问题,发现好多人不知道怎么下载免费版的Xshell,在这里我将详细告诉大家如何下载和安装最新的Xshell6远程管理工具. Xshell安装 1.进入xshell英文 ...