<allocators>
ノード ベースのコンテナーのメモリ ブロックの割り当てと解放に役立ついくつかのテンプレートを定義します。
構文
#include <allocators>
Note
<allocators> は、Visual Studio 2019 バージョン 16.3 から非推奨とされます。
解説
<allocators> ヘッダーは、ノード ベースのコンテナーのメモリ管理方法を選択するために使用できる 6 つのアロケーター テンプレートを提供します。 これらのテンプレートで使用するため、さまざまなマルチスレッド スキーム (なしを含む) に合わせてメモリ管理方法を調整するためのさまざまな同期フィルターも用意されています。 メモリ管理戦略をメモリ使用量パターンと同期要件に一致することで、アプリを高速化したり、メモリ要件を減らしたりすることができます。
アロケーター テンプレートを、カスタマイズまたは交換可能な再利用可能なコンポーネントと共に実装することで、追加のメモリ管理方法が提供されます。
C++ 標準ライブラリのノード ベースのコンテナー (std::list、std::set、std::multiset、std::map および std::multimap) は、要素を個々のノードに格納します。 特定のコンテナーの種類のノードはすべて同じサイズであるため、汎用のメモリ マネージャーの柔軟性は必要ありません。 コンパイル時に各メモリ ブロックのサイズがわかっているため、メモリ マネージャーはずっとシンプルで高速なものにできます。
ノード ベースではないコンテナー (C++ 標準ライブラリのコンテナー std::vector std::deque や std::basic_string など) で使用する場合、アロケーター テンプレートは正常に動作しますが、既定のアロケーターよりもパフォーマンスが向上することはまずありません。
アロケーターは、オブジェクトおよび指定した型のオブジェクトの配列に対し、ストレージの割り当てと解放を管理するオブジェクトを記述するクラス テンプレートです。 アロケーター オブジェクトは、C++ 標準ライブラリ内の複数のコンテナー クラス テンプレートによって使用されます。
アロケーターは、この型のすべてのテンプレートです。
template<class Type>
class allocator;
ここでテンプレート引数 Type
は、アロケーター インスタンスによって管理されている型です。 C++ 標準ライブラリには、既定のアロケーター、クラス テンプレート allocator が用意されています。これは <memory> で定義されます。 <allocators> ヘッダーは、次のアロケーターを提供します。
次のコード例のようなコンテナーを作成する際に、アロケーターの適切なインスタンス化を 2 番目の型引数として使用します。
#include <list>
#include <allocators>
std::list<int, stdext::allocators::allocator_chunklist<int> > _List0;
_List0 は、allocator_chunklist
と既定の同期フィルターを使用してノードを割り当てます。
マクロ ALLOCATOR_DECL を使用して、既定以外の同期フィルターを持つアロケーター テンプレートを作成します。
#include <list>
#include <allocators>
ALLOCATOR_DECL(CACHE_CHUNKLIST, stdext::allocators::sync_per_thread, Alloc);
std::list<int, alloc<int> > _List1;
_Lst1 は、allocator_chunklist
と sync_per_thread 同期フィルターを使用してノードを割り当てます。
ブロック アロケーターは、キャッシュまたはフィルターです。 キャッシュは、std::size_t 型の引数を 1 つ取るクラス テンプレートです。 1 つのサイズのメモリ ブロックを割り当ておよび割り当て解除するブロック アロケーターを定義します。 演算子 new
を使用してメモリを取得する必要がありますが、ブロックごとに演算子 new
を呼び出す必要はありません。 たとえば、より大規模なブロックからサブ割り当てしたり、割り当て解除したブロックを後続の再割り当てのためにキャッシュしたりすることができます。
テンプレートがインスタンス化されたときに使用した std::size_t 引数の値を再バインドできないコンパイラでは、必ずしもキャッシュのメンバー関数 allocate と deallocate に渡された引数 _Sz の値ではありません。
<allocators> は次のキャッシュ テンプレートを提供します。
フィルターは、テンプレート引数として渡された別のブロック アロケーターを使用するメンバー関数を実装するブロック アロケーターです。 フィルターの最も一般的な形式は同期フィルターです。これは、別のブロック アロケーターのインスタンスのメンバー関数へのアクセスを制御するために同期ポリシーを適用します。 <allocators> は次の同期フィルターを提供します。
<allocators> は、フィルター rts_alloc も提供します。これは、複数のブロック アロケーター インスタンスを保持し、コンパイル時ではなく、実行時に割り当てまたは割り当て解除に使用するインスタンスを判別します。 再バインドをコンパイルできないコンパイラと一緒に使用します。
同期ポリシーは、アロケーター インスタンスが複数のスレッドからの割り当てと割り当て解除の同時要求を処理する方法を決定します。 最も単純なポリシーは、すべての要求を基になるキャッシュ オブジェクトに直接渡し、同期の管理をユーザーに任せることです。 より複雑なポリシーは、ミューテックスを使用して、基になるキャッシュ オブジェクトへのアクセスをシリアル化することができます。
コンパイラがシングル スレッド アプリケーションとマルチ スレッド アプリケーションの両方のコンパイルをサポートしている場合、シングル スレッド アプリケーションの既定の同期フィルターは sync_none
で、それ以外の場合は sync_shared
になります。
キャッシュ テンプレート cache_freelist
は、フリー リストに格納される要素の最大数を決定する最大クラスの引数を取ります。
<allocators> は次の最大クラスを提供します。
マクロ
マクロ | 説明 |
---|---|
ALLOCATOR_DECL | アロケーター クラス テンプレートを生成します。 |
CACHE_CHUNKLIST | stdext::allocators::cache_chunklist<sizeof(Type)> を生成します。 |
CACHE_FREELIST | stdext::allocators::cache_freelist<sizeof(Type), max> を生成します。 |
CACHE_SUBALLOC | stdext::allocators::cache_suballoc<sizeof(Type)> を生成します。 |
SYNC_DEFAULT | 同期フィルターを生成します。 |
演算子
演算子 | 説明 |
---|---|
operator!= (<allocators>) | 指定したクラスのアロケーター オブジェクト間の非等値をテストします。 |
operator== (<allocators>) | 指定したクラスのアロケーター オブジェクト間の等値をテストします。 |
クラス
クラス | 説明 |
---|---|
allocator_base | 同期フィルターからユーザー定義のアロケーターを作成するために必要な、基底クラスと共通の関数を定義します。 |
allocator_chunklist | cache_chunklist 型のキャッシュを使用して、オブジェクトに対してストレージの割り当てと解放を管理するオブジェクトを記述します。 |
allocator_fixed_size | cache_freelist 型のキャッシュと max_fixed_size で管理されている長さを使用して、型 Type のオブジェクトに対し、ストレージの割り当てと解放を管理するオブジェクトを記述します。 |
allocator_newdel | operator delete を使用してメモリ ブロックの割り当てを解放し、operator new を使用してメモリ ブロックを割り当てるアロケーターを実装します。 |
allocator_suballoc | cache_suballoc 型のキャッシュを使用して、Type 型のオブジェクトに対し、ストレージの割り当てと解放を管理するオブジェクトを記述します。 |
allocator_unbounded | cache_freelist 型のキャッシュと max_unbounded で管理されている長さを使用して、型 Type のオブジェクトに対し、ストレージの割り当てと解放を管理するオブジェクトを記述します。 |
allocator_variable_size | cache_freelist 型のキャッシュと max_variable_size で管理されている長さを使用して、型 Type のオブジェクトに対し、ストレージの割り当てと解放を管理するオブジェクトを記述します。 |
cache_chunklist | 1 つのサイズのメモリ ブロックを割り当ておよび割り当て解除するブロック アロケーターを定義します。 |
cache_freelist | 1 つのサイズのメモリ ブロックを割り当ておよび割り当て解除するブロック アロケーターを定義します。 |
cache_suballoc | 1 つのサイズのメモリ ブロックを割り当ておよび割り当て解除するブロック アロケーターを定義します。 |
freelist | メモリ ブロックの一覧を管理します。 |
max_fixed_size | freelist オブジェクトを固定の最長値までに制限する最大クラス オブジェクトを記述します。 |
max_none | freelist オブジェクトを最長値ゼロまでに制限する最大クラス オブジェクトを記述します。 |
max_unbounded | freelist オブジェクトの最長値を制限しない最大クラス オブジェクトを記述します。 |
max_variable_size | 割り当てたメモリ ブロックの数にほぼ比例した最長値までに freelist オブジェクトを制限する、最大クラス オブジェクトを記述します。 |
rts_alloc | rts_alloc クラス テンプレートは、キャッシュ インスタンスの配列を保持し、コンパイル時ではなく、実行時に割り当てと割り当て解除に使用するインスタンスを判別するフィルターを記述します。 |
sync_none | 同期を提供しない同期フィルターを表します。 |
sync_per_container | アロケーター オブジェクトごとに個別のキャッシュ オブジェクトを提供する同期フィルターを記述します。 |
sync_per_thread | スレッドごとに個別のキャッシュ オブジェクトを提供する同期フィルターを記述します。 |
sync_shared | すべてのアロケーターによって共有されているキャッシュ オブジェクトへのアクセスを制御するためにミューテックスを使用する同期フィルターを表します。 |
要件
ヘッダー: <allocators>
名前空間: stdext