2009-10-21 11 views
8

STLカスタムアロケータクラスの異なるインスタンスを使用して、異なるメモリ空間を管理し、各コンテナのみから描画するようにアロケータインスタンスをSTLコンテナに指定することができます。割り当てられたメモリ空間。しかし、私はそれをどうやってできるのか分かりません。私はアロケータ型をSTLコンテナのテンプレートパラメータに渡す方法を見ていますが、アロケータインスタンスをSTLコンテナのコンストラクタに渡すのと同じことが必要です。 STLでこれを行う方法はありますか?異なるメモリ空間を管理するためのSTLカスタムアロケータ

答えて

17

残念なことに、STLアロケータは状態を持つことができません(または、少なくともその状態がどのように使用されるか注意する必要があります) - STLコンテナが効果的に機能するには、特定のアロケータタイプの各インスタンスが同等でなければなりません。私は今詳細を思い出すことはありませんが、Scott Meyersがこの問題について長らく議論していることを知っています"Effective STL"、Item 10:アロケータの規則と制限に注意してください。

ただし、アロケータタイプにカプセル化し、アロケータテンプレートの異なる「インスタンス化」を使用しているアロケータとの違いと非常に似ているアロケータをテンプレート化していることができます(各テンプレート「インスタンス化」は異なるタイプです) 。再び、私の想いはマイヤーズがこれをかなり明確に議論していることです。例えば

Anthony Aue, "Improving Performance with Custom Pool Allocators for STL"の記事からこの項を参照してください。

規格が同じのアロケータを必要とするため、潜在的に深刻な警告がアロケータは非静的データを使用しているため、それは技術的に標準に準拠しない、ということですタイプは同等です。この問題の詳細な説明については、有効なSTL(項目10)を参照してください。これは、与えられた型のためのアロケータが、その型のアロケータの他のインスタンスによって割り当てられたメモリの割り当てを解除することを要求することになります。標準的なコンテナの多くの用途では、この要件は不要です(Draconianと言う人もいます)。しかし、この要件が絶対に必要な2つのケースがあります:list :: spliceとswap()。 swap()のケースは、例外的に安全な方法でコンテナに対して特定の操作を実装するために必要であるため、特に重大です(Exceptional C++、Item 12を参照)。技術的には、スワップは、均等に比較されないアロケータの面で実装される可能性があります(場合によっては、コピーされるか、アロケータがデータと共にスワップされる可能性がありますが、必ずしもそうではありません)。このため、swap()またはlist :: spliceを使用している場合は、必ずHoldPolicySingletonを使用してください。そうでなければ、本当に厄介な振る舞いに遭遇します。

this newsgroup threadのStephan T. Lavavejのディスカッションもご覧ください。

他の誰かがその間に詳細を知らせなかった場合は、今晩後に更新します。

+2

ただし、C++ 0xでは、不等なアロケータのサポートが必要です。 –

+1

C++ 0x "Scoped Allocators"に関するStroustupのFAQ:http://www.research.att.com/~bs/C++0xFAQ.html#scoped-allocator –

+0

+1 - 私はこの答えにもっとぶつかることができたらいいと思う。 STLのアロケータは、機能に貢献するよりも難解なバグを集めています。 – Fox

0

おそらく、別々のメモリ空間への静的なポインティングを含む一連のアロケータ型をコーディングできます。

次に、STLコンテナがそのアロケータを構築するとき、アロケータはそのアロケータに割り当てられたメモリ空間を使用します。

簡素化のため、2つのメモリスペースを使用するとします。各スペースに1つずつ、2つのアロケータ・タイプを作成します。必要に応じて、アロケータ型をSTLコンテナコンストラクタに渡します。

6

STLコンテナを使用すると、アロケータをコンストラクタの引数として渡すことができます。例えば

は、ここでは、ベクターのための適切なコンストラクタです:

explicit vector(const Allocator& = Allocator()); 
explicit vector(size_type n, const T& value = T(), 
    const Allocator& = Allocator()); 
template <class InputIterator> 
vector(InputIterator first, InputIterator last, 
    const Allocator& = Allocator()); 

デフォルトでは、彼らは単にデフォルト構築アロケータを使用します。