天天看點

記憶體管理 Boost::singleton_pool

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的執行個體。