zoukankan      html  css  js  c++  java
  • 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 "boostpoolpool.hpp"
    using namespace boost;
    
    int main()
    {
        pool<> p1(sizeof(int));
    
        int* p = (int*)p1.malloc();
        *p = 10;
        cout << *p << endl;
    
        return 0;
    }

     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 "boostpoolobject_pool.hpp"
    using namespace boost;
    
    int main()
    {
        object_pool<string> ops;
        string* p = ops.construct("test");
        cout << *p << endl;
    
        return 0;
    }

     3、singleton_pool

      singleton_pool是pool的线程安全版本,它是单例模式的,用户不用创建它,它可以保证在main函数运行之前就创建了单例。singleton_pool的模板类型参数有两个,其中 第一个可以是一个空类,第二个与pool的模板参数意义相同。

      简单实用示例:

    #include <iostream>
    #include <string>
    using namespace std;
    
    #include "boostpoolsingleton_pool.hpp"
    using namespace boost;
    
    struct pool_tag {};
    typedef singleton_pool<pool_tag, sizeof(int)> slp;
    int main()
    {
        int* p = (int*)slp::malloc();
        *p = 10;
        cout << *p << endl;
    
        return 0;
    }
  • 相关阅读:
    nodejs 的序列化与反序列化
    Visual Studio 监视与快速监视即时窗口没有智能提示
    mysql 备份数据语句
    mysql 导入sql 2006
    MySql.Data.MySqlClient.MySqlException (0x80004005): Unable to connect to any of the specified MySQL hosts.
    怎么查看mysql的安装目录
    【支付宝】退款接口 报 “缺少签名参数”
    【支付宝】"验签出错,sign值与sign_type参数指定的签名类型不一致:sign_type参数值为RSA,您实际用的签名类型可能是RSA2"
    【支付宝】支付 系统繁忙,请稍后再试(ALIN10146)
    php插入日志到数据库,对象转json
  • 原文地址:https://www.cnblogs.com/milanleon/p/8624298.html
Copyright © 2011-2022 走看看