singleton_pool與pool的接口完全一緻,可以配置設定簡單資料類型(POD)的記憶體指針,但它是一個單件,并提供線程安全。
由于目前Boost還未提供标準的單件庫,singleton_pool在其内部實作了一個較簡單、泛型的單件類,保證在main()函數運作之前就建立單件(詳情可參考4.6.1小節,117頁)。
singleton_pool位于名字空間boost,為了使用singleton_pool元件,需要包含頭檔案<boost/pool/singleton_pool.hpp>,即:
#include <boost/pool/singleton_pool.hpp>
using namespace boost;
3.11.1 類摘要
singleton_pool的類摘要如下:
template <typename Tag, unsigned RequestedSize>
class singleton_pool
{
public:
static bool is_from(void * ptr);
static void * malloc();
static void * ordered_malloc();
static void * ordered_malloc(size_type n);
static void free(void * ptr);
static void ordered_free(void * ptr);
static void free(void * ptr, std::size_t n);
static void ordered_free(void * ptr, size_type n);
static bool release_memory();
static bool purge_memory();
};
3.11.2 用法
singleton_pool主要有兩個模闆類型參數(其餘的可以使用預設值)。第一個Tag僅僅是用于标記不同的單件,可以是空類,甚至是聲明(這個用法還被用于boost.exception,參見4.9小節,136頁)。第二個參數RequestedSize等同于pool構造函數中的整數requested_ size,訓示pool配置設定記憶體塊的大小。
singleton_pool的接口與pool完全一緻,但成員函數均是靜态的,是以不需要聲明singleton_pool的執行個體[1],直接用域操作符::來調用靜态成員函數。因為singleton_pool是單件,是以它的生命周期與整個程式同樣長,除非手動調用release_memory()或purge_memory(),否則singleton_pool不會自動釋放所占用的記憶體。除了這兩點,singleton_pool的用法與pool完全相同。
下面的代碼示範了singleton_pool的用法:
struct pool_tag{}; //僅僅用于标記的空類
typedef singleton_pool<pool_tag, sizeof(int)> spl; //記憶體池定義
int main()
int *p = (int *)spl::malloc(); //配置設定一個整數記憶體塊
assert(spl::is_from(p));
spl::release_memory(); //釋放所有未被配置設定的記憶體
} //spl的記憶體直到程式結束才完 //全釋放,而不是退出作用域
singleton_pool在使用時最好使用typedef來簡化名稱,否則會使得類型名過于冗長而難以使用。如代碼中所示:
typedef singleton_pool<pool_tag, sizeof(int)> spl;
用于标記的類pool_tag可以再進行簡化,直接在模闆參數清單中聲明tag類,這樣可以在一條語句中完成對singleton_pool的類型定義,例如:
typedef singleton_pool<struct pool_tag, sizeof(int)> spl;
[1] 因為使用了單件模式,使用者也無法建立singleton_pool的執行個體。