VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1500|回复: 3

[交流] boost 內存池

[复制链接]
008
74_avatar_middle
在线会员 发表于 2015-8-23 15:01:15 | 显示全部楼层 |阅读模式
本帖最后由 zuiwuchang 于 2015-8-23 15:07 编辑

這個版塊還是這麼冷清 boost幾乎是鄙人不可或缺的庫 離開了簡直不知道 怎麼寫c++程序 STL 更加是c++的基礎
我就不解 為何 此版塊這麼冷清 建議站長 宣傳下 STL 和 boost 中華玩這兩個東西的人越多 程序員的質量才能提升(個人愚見罷)


正文
頻繁的 new/mallac free/delete 是相當耗時的 每次這樣的操作都會提交到os的內核 由os進行調度 而這樣頻繁的操作 有時往往不可避免 比如在遊戲中 需要不斷的 產生被主角幹掉的雜魚 此時需要為之new出雜魚 而被幹掉後 需要delete掉

此時要提高 效率的做法 就是 建立一個內存池 內存池 是一塊事先申請好的 連續內存
當需要new時 不向os申請 而是從 內存池中 獲取內存(為之標記為已佔用) 當釋放時 亦不將內存還給os 而是交還給內存池(為之標記為空閒)
這樣 內存的 申請釋放 不必由os調用 相比會快很多(畢竟只是 在用戶態加個標記 不想要 os進行各種 協調 準備 ... 工作 自然快很多)

boost 提供了 幾個內存池 其中
boost::pool 是一個 malloc/free 的 c 內存池 (模擬 malloc free 內存 管理 故 不會調用對象的 構造 析構函數)  

boost::object_pool 是一個 new/delete 的 c++ 內存池 (模擬 new delete 內存 管理 故 調用對象的 構造 析構函數)


boost::pool
boost::pool 定義在 #include <boost/pool/pool.hpp> 中
  1. // In header: <boost/pool/pool.hpp>

  2. template<typename UserAllocator>
  3. class pool :
  4.   protected boost::simple_segregated_storage< UserAllocator::size_type >
  5. {
  6. public:
  7.   // types
  8.   typedef UserAllocator                  user_allocator;   // User allocator.
  9.   typedef UserAllocator::size_type       size_type;        // An unsigned integral type that can represent the size of the largest object to be allocated.
  10.   typedef UserAllocator::difference_type difference_type;  // A signed integral type that can represent the difference of any two pointers.

  11.   // construct/copy/destruct
  12.   explicit pool(const size_type, const size_type = 32, const size_type = 0);
  13.   ~pool();

  14.   // private member functions
  15.   void * malloc_need_resize();
  16.   void * ordered_malloc_need_resize();

  17.   // protected member functions
  18.   simple_segregated_storage< size_type > & store();
  19.   const simple_segregated_storage< size_type > & store() const;
  20.   details::PODptr< size_type > find_POD(void *const) const;
  21.   size_type alloc_size() const;

  22.   // protected static functions
  23.   static bool is_from(void *const, char *const, const size_type);
  24.   static void *& nextof(void *const);

  25.   // public member functions
  26.   bool release_memory();
  27.   bool purge_memory();
  28.   size_type get_next_size() const;
  29.   void set_next_size(const size_type);
  30.   size_type get_max_size() const;
  31.   void set_max_size(const size_type);
  32.   size_type get_requested_size() const;
  33.   void * malloc();
  34.   void * ordered_malloc();
  35.   void * ordered_malloc(size_type);
  36.   void free(void *const);
  37.   void ordered_free(void *const);
  38.   void free(void *const, const size_type);
  39.   void ordered_free(void *const, const size_type);
  40.   bool is_from(void *const) const;
  41. };
复制代码


模板變量 UserAllocator 指定了 內存 管理 算法 boost提供了默認值 用戶亦可自行實現
//構造函數
explicit pool(const size_type nrequested_size, //塊大小 (每次 malloc 申請的內存 大小)                  const size_type nnext_size = 32, const size_type nmax_size = 0);
//申請/釋放  void * malloc();
void free(void *const chunk);
...其他見 boost 官方文檔


boost::pool example


  1. #include <boost/pool/pool.hpp>
  2. int _tmain(int argc, _TCHAR* argv[])
  3. {
  4.         {
  5.                 //創建 一個 int 內存池
  6.                 boost::pool<> pool(sizeof(int));

  7.                 {
  8.                         //申請 塊
  9.                         int* lp        =        (int*)pool.malloc();
  10.                         int x = 0;
  11.                         *lp = x;
  12.                         std::cout<<"lp is_from "<<pool.is_from(lp)<<"\n";
  13.                         std::cout<<"x is_from "<<pool.is_from(&x)<<"\n";
  14.                         pool.free(lp);
  15.                 }
  16.                 {
  17.                         //申請連續塊(數組)
  18.                         int* arrays = (int*)pool.ordered_malloc(5);
  19.                         for(int i=0;i<5;++i)
  20.                         {
  21.                                 arrays[i] = i + 1102;
  22.                         }

  23.                
  24.                         for(int i=0;i<5;++i)
  25.                         {
  26.                                 std::cout<<arrays[i]<<"\n";
  27.                         }
  28.                         pool.free(arrays,5);
  29.                 }
  30.         }
  31.         //pool 析構時 自動 釋放 所有 內存池中的 內存
  32.         std::system("pause");
  33.         return 0;
  34. }
复制代码


boost::object_pool
boost::object_pool 定義在 #include<boost/pool/object_pool.hpp> 中 其用法 基本同 pool
只是 現在 調用 construct 申請內存 destroy 釋放內存 並且 對象的 構造 析構函數 會被 調用


boost::object_pool example

  1. #include<boost/pool/object_pool.hpp>

  2. class Test
  3. {
  4. public:
  5.         Test()
  6.         {
  7.                 puts("test");
  8.         }
  9.         Test(const char* str)
  10.         {
  11.                 printf("帶參數的構造(最多3個參數) \nparam = %s\n",str);
  12.         }
  13.         ~Test()
  14.         {
  15.                 puts("~test");
  16.         }
  17. };

  18. int _tmain(int argc, _TCHAR* argv[])
  19. {
  20.         {
  21.                 //一個管理 Test 的 內存池
  22.                 boost::object_pool<Test> pool;
  23.                 Test* ptr        =        pool.construct();
  24.                 pool.destroy(ptr);

  25.                 ptr = pool.construct("test param one");
  26.         }
  27.         //object_pool 析構時會 釋放 所有內存

  28.         std::system("pause");
  29.         return 0;
  30. }
复制代码









上一篇:[野狐行网游研究][二期][8.21更新]
下一篇:[野狐行网游研究][三期][8.21更新]
83_avatar_middle
在线会员 发表于 2015-8-25 10:22:52 | 显示全部楼层
确实STL和BOOST确实是C++不可缺少的。
65_avatar_middle
在线会员 发表于 2015-10-2 21:35:38 | 显示全部楼层
STL确实是C++不可缺少的,但是那么多年一直也没用BOOST也过去了,不过倒是实现了很多类似BOOST的功能  也根据实际情况实现了很多内存池
74_avatar_middle
ico_lz  楼主| 发表于 2015-10-2 23:27:44 | 显示全部楼层
yaoyuanzhi 发表于 2015-10-2 21:35
STL确实是C++不可缺少的,但是那么多年一直也没用BOOST也过去了,不过倒是实现了很多类似BOOST的功能  也根 ...

你是勤快人 我是懶人 所以 你不用boost 我要用boost

像我這種懶惰的人 是不會(至少是無路可走 才考慮自己實現)自己 去實現 複雜的 組件
而且 持續為它 更新 修補bug 解決平台依賴

但編程時又確實需要這些組件 所以 只好用boost
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-6-20 02:19

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表