0

Scott Meyers による効果的な STL を読んでいます。項目 11 には、アロケーターに関する以下のテキストがあります。

アロケーターの有用性を考えると、クラス Heap1 と Heap2 で識別される 2 つのヒープがあるとします。各ヒープ クラスには、割り当てと割り当て解除を実行するための静的メンバー関数があります。

class Heap1 {
public:
…
static void* alloc(size_t numBytes, const void *memoryBlockToBeNear); static void dealloc(void *ptr);
…
};
class Heap2 { ... }; // has the same alloc/dealloc interface

さらに、いくつかの STL コンテナーのコンテンツを異なるヒープに配置したいとします。繰り返しますが、問題ありません。まず、実際のメモリ管理に Heap1 や Heap2 などのクラスを使用するように設計されたアロケータを作成します。

template<typenameT, typename Heap>
SpecificHeapAllocator {
public:
pointer allocate(size_type numObjects, const void *localityHint = 0)
{
return static_cast<pointer> (Heap::alloc(numObjects * sizeof(T),
localityHint));
}
void deallocate(pointer ptrToMemory, size_type numObjects)
{
Heap::dealloc(ptrToMemory);
}
…
};

次に、SpecialHeapAllocator を使用してコンテナーの要素をまとめてクラスター化します。

vector<int, SpecificHeapAIlocator<int, Heap1 > > v; // put both v's and set<int, SpecificHeapAllocator<int Heap1 > > s; //s's elements in
//Heap1
list< Widget,
SpecificHeapAllocator<Widget, Heap2> > L; // put both L's and
map< int, string, less<int>, // m's elements in
SpecificHeapAllocator<pair<const int, string>, // Heap2
                                       Heap2> > m;

この例では、Heap1 と Heap2 がオブジェクトではなく型であることが非常に重要です。STL は、同じ型のさまざまなアロケーター オブジェクトを使用してさまざまな STL コンテナーを初期化するための構文を提供しますが、それが何であるかを説明するつもりはありません。これは、Heap1 と Heap2 が型ではなくオブジェクトである場合、それらは等価でないアロケーターになり、アロケーターの等価制約に違反するためです。

上記の私の質問は

  1. 「同じタイプの異なるアロケータ オブジェクトで異なる STL コンテナを初期化する」ための STL 構文は何ですか?

  2. Heap1 と Heap2 がオブジェクトである場合、それらが同等でないアロケータであるのはなぜですか?

4

0 に答える 0