シングルトンプール
singleton_pool のインターフェイスは pool のインターフェイスと全く同じであり、シンプル データ型 (POD) のメモリ ポインタを割り当てることができますが、シングルトンです。
singleton_pool は名前空間 boost にあります。singleton_pool コンポーネントを使用するには、ヘッダー ファイル <boost/pool/singleton_pool.hpp> を含める必要があります。
#include <boost/pool/singleton_pool.hpp>
using namespace boost;
singleton_pool は、boost.thread ライブラリを使用してデフォルトでスレッド セーフ保証を提供するため、boost_thread ライブラリをリンクする必要があります。マルチスレッドが使用されない場合は、マクロ BOOST_POOL_NO_MT をヘッダー ファイルの前に定義できます。
授業の概要
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 voidfree(void * ptr, std: : size_t n);
static voidordered_free (void * ptr, size_type n);
static bool release_memory(); //释放内存
static bool purge_memory();
);
使用法
singleton_pool には主に 2 つのテンプレート タイプ パラメータがあります (残りはデフォルト値を使用できます)。最初のタグは、異なるシングルトンをマークするためにのみ使用されます。これは、空のクラスまたは宣言であっても構いません (この使用法は boost.Exception にも使用されます)。2 番目のパラメーター RequestedSize は、プール コンストラクターの整数 requested_size に相当し、プールによって割り当てられたメモリ ブロックのサイズを示します。
singleton_pool のインターフェイスは pool のインターフェイスとまったく同じですが、メンバー関数はすべて静的であるため、singleton_pool のインスタンスを宣言する必要はありません。フィールド演算子を直接使用して::
、静的メンバー関数を呼び出します。singleton_pool はシングルトンであるため、そのライフサイクルはプログラム全体と同じ長さであり、 release_memory() または purge_memory() を手動で呼び出さない限り、singleton_pool は占有メモリを自動的に解放しません。この 2 点を除けば、singleton_pool の使い方は pool とまったく同じです。
#define BOOST_POOL_NO_MT //不使用多线程
#include <boost/pool/singleton_pool.hpp>
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 は再度簡略化でき、タグ クラスをテンプレート パラメータ リストで直接宣言できるため、singleton_pool の型定義を 1 つのステートメントで完了できます。次に例を示します。
typedef singleton_pool<struct pool_tag, sizeof (int)> spl;
コード例
#define BOOST_POOL_NO_MT
#include <boost/pool/singleton_pool.hpp>
struct pool_tag {
};
typedef singleton_pool<pool_tag, sizeof(int)> spl;
void case4()
{
int* p = (int*)spl::malloc();
assert(spl::is_from(p));
spl::release_memory();
}
int main()
{
case4();
}