Boost 開発ガイド - 3.10 singleton_pool

シングルトンプール

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

おすすめ

転載: blog.csdn.net/qq_36314864/article/details/132066934
おすすめ