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