初步boost之pool图书馆学习笔记

pool

内存池概述

通常我们习惯直接使用new、malloc等API申请分配内存,这样做的缺点在于:因为所申请内存块的大小不定。当频繁使用时会造成大量的内存碎片并进而减少性能。

内存池则是在真正使用内存之前,先申请分配一定数量的、大小相等(普通情况下)的内存块留作备用。当有新的内存需求时。就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存。

这样做的一个显著长处是尽量避免了内存碎片。使得内存分配效率得到提升。

pool库概述

pool库实现了一个高速、紧凑的内存池库,不仅可以管理大量的对象,也可以作为STL的内存分配器。某种程度上它近似于一个小型的垃圾回收机制,在须要大量分配和释放小对象时。有非常高的效率,并且全然不用考虑delete。

pool库包含4个组件:pool 、object_pool 、singleton_pool 、pool_alloc 。

pool

最简单、最易使用的内存池。返回一个简单数据类型的内存指针。

在头文件 #include<boost/pool/pool.hpp>

操作函数

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZ3hpYW9idXB0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">

使用方法

#include<iostream>
#include<boost/pool/pool.hpp>
using namespace std;
using namespace boost;

int main()
{
    pool<> rpool(sizeof(int));   //定义内存池 内存块大小以int为单位
    int *p = (int *)rpool.malloc();  //void* 转换为 int*
    rpool.free(p);  //释放
    return 0;
}

注:

pool在分配失败时不会抛出异常,实际编写代码时应该检查返回的时候是否为空。

object_pool

object_pool用于对象(类实例)的内存池。

使用时包括头文件#include<boost/pool/object_pool.hpp>

操作函数

使用方法

#include<iostream>
#include<boost/pool/object_pool.hpp>
using namespace std;
using namespace boost;

class class_type
{
public:
    int a;
    class_type(int _a = 0):a(_a){};
};

int main()
{
    object_pool<class_type> pl; // 定义这个类的内存池
    class_type * p = pl.malloc(); //调用malloc函数 返回一个类类型的内存块 初始化该类型的指针
    cout<<p->a;  //默认是0

    p = pl.construct(100); //构造一个新对象
    cout<<p->a;
    return 0;

}

singleton_pool

头文件#include<boost/pool/singleton_pool.hpp>

与pool接口全然一致

pool_alloc

头文件#include<boost/pool/pool_alloc.hpp>

提供了两个标准容器模版參数的内存分配器pool_alloc和fast_pool_allocator

使用方法

#include<iostream>
#include<boost/pool/pool_alloc.hpp>
#include<vector>
using namespace std;
using namespace boost;

int main()
{
    vector<int,pool_allocator<int> >  v;
    v.push_back(1);
    cout<<v.size();
    return 0;
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-10-26 02:10:10

初步boost之pool图书馆学习笔记的相关文章

初探boost之pool库学习笔记

pool 内存池概述 通常我们习惯直接使用new.malloc等API申请分配内存,这样做的缺点在于:由于所申请内存块的大小不定,当频繁使用时会造成大量的内存碎片并进而降低性能. 内存池则是在真正使用内存之前,先申请分配一定数量的.大小相等(一般情况下)的内存块留作备用.当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存.这样做的一个显著优点是尽量避免了内存碎片,使得内存分配效率得到提升. pool库概述 pool库实现了一个快速.紧凑的内存池库,不仅能够管理大量的

公益图书馆-学习笔记

1.HTML <caption> 标签 caption 标签必须紧随 table 标签之后.您只能对每个表格定义一个标题.通常这个标题会被居中于表格之上. <table border="6"> <caption>表格标题</caption> 2.模板继承是thinkphp的一项更加灵活的模板布局方式,模板继承不同于模板布局. 模板可以定义一个基础模板,并且定义相关的区块(block),然后继承(extend)该基础模板的子模板中就可以对基

公益图书馆-学习笔记四

1.复选框及其使用方法: <select class="form-control statusSelect" name="select" onchange="javascript:location.href=this.value;"> //注意: onchange内的javascript函数 <option selected value="/user/index?status=yes">我被选中<

公益图书馆-学习笔记三

1.脚手架页面布局--bootstrap 我们的整个页面分成了16个span,即16部分.在添加一个block时,要在里面设置一个div,然后div里面设置该模块所占的span数和内边距: <block name="content"> <div class="span12 p20"> <form ...> </div> </block> 该代码表示content模块占据12个span,内边距为20. 2.T

公益图书馆-学习笔记二

1.在视图中显示控制器变量. 在控制其中为变量赋值即可,如 $this->info_user=$user;然后在视图中可直接使用. 2.html显示数组使用 volist标签 <volist name="info_user" id="vo"> {$vo.username} {$vo.email}即可使用数组里的键值对 3.隐藏button <button type="submit" style="display:

初探boost之timer库学习笔记

timer 用法 #include <boost/timer.hpp> #include <iostream> using namespace std; using namespace boost; int main() { timer t;//声明一个计时器对象,开始计时 cout<<"max:"<<t.elapsed_max()/3600<<"h"<<endl; //可度量的最大时间,以小时

初探boost之progress_display库学习笔记

progress_display 用途 progress_display可以在控制台上显示程序的执行进度,如果程序执行很耗费时间,那么它能提供一个友好的用户界 面,不至于让用户在等待中失去耐心,甚至怀疑程序的运行是否出了问题. 用法示例 #include <boost/progress.hpp> #include <iostream> #include <vector> using namespace std; using namespace boost; int ma

初探boost之smart_ptr库学习笔记

概述 Boost.smart_ptr库提供了六种智能指针,除了shared_ptr 和 weak_ptr 以外还包括 scoped_ptr .scoped_array . shared_array .intrusive_ptr .他们的速度与原始指针相差无几,都是异常安全的,而且对于类型T也仅有一个要 求:类型T的析构函数不能抛出异常. 使用时包含头文件: #include<boost/smart_ptr.hpp> scoped_ptr 用法: scoped_ptr 的构造函数接受一个类型为T

公益图书馆-学习笔记五

使用jquery来设置html元素的显示与隐藏属性,同时调整div的高度 点击上面的“收起回复”超链接之后,执行下面几个动作: a.“收起回复”变成“回复(3)”: b.回复全部隐藏: c.重新自适应高度. 再次点击“回复(3)”后,执行下面几个动作: a.“回复(3)”变成“收起回复”: b.回复全部显示: c.重新自适应高度. 1.为了绑定jquery函数,先对html元素或div要设置 类class 2.实现“收起回复”和“回复(3)”之间的转换 对象:.replyTrigger 内容:使