• 初步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>

     

     

    操作函数

    使用方法

     

    #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;
    }


     

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

  • 相关阅读:
    JqueryValidate表单相同Name不校验问题解决
    钉钉SDK使用。
    禁用software reporter tool.exe 解决CPU高占用率的问题
    一个小巧,也很nice的“小日历”--一个Android App
    Android模拟器太慢怎么办?使用微软的VS模拟器
    windows10下录屏
    启明星会议室预订系统(企业微信)版发布
    JS图片压缩
    JS操作摄像头
    钉钉版会议室预订系统使用指南
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4824110.html
Copyright © 2020-2023  润新知