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 = 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 "boost\pool\object_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 "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 = 10; cout << *p << endl; return 0; }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM