4

複数の std map<int,int> を使用することに興味があり、それらすべてに共通のメモリ プールから要素を割り当てるようにしたいと考えています。これまでに読んだことから、Boost pool_alloc などのカスタム アロケータを使用してこれを実現できます。

私の質問は、Boost pool_alloc のようなものを使用して要素自体の割り当てを管理しているにもかかわらず、std マップは、boost pool_alloc によって管理されない何らかの形のコンテナー オーバーヘッドとしてヒープ メモリを使用しますか? std マップ自体の使用に関して、要素へのポインターの行に沿って何かを考えていますか?

4

1 に答える 1

3

ショートバージョン

次のようなマップ タイプ:

typedef std::map<
    int,
    int,
    less<int>,
    boost::pool_allocator<pair<const int, int> >
    > 
    AMapType;

boost::pool_allocators を使用して、成長するにつれて必要なすべての割り当てを行います。初期構造の一部は、スタック上に作成される可能性があります。ただし、正確な構造がどの程度であるかは、実装に依存します。

アロケーターの再バインド

上記は、を使用することで可能ですallocator::rebind

すべての std::allocator 準拠アロケーター (boost::pool_allocator など) は、次の形式で rebind テンプレート構造体を提供します。

template<class U> struct rebind{
   typedef AllocatorType<U> other;
};

これを使用して、異なるタイプの同じ種類のアロケーターを取得できます。

typedef AllocatorOfOther AllocatorType::rebind<ADifferentType>::other;

gcc std::map 内部構造

g++ std::map 実装 (私は 4.7.3 と 4.1.1 を調査しました) は、純粋に単一のノード タイプから構築されています。これには、rbTree 構造に必要なキーと値のペア、ポインター、およびカラー ビットが含まれます。これを割り当てるために、ユーザー提供のアロケーターから rebind 構造体を使用してノード アロケーターを定義します。これは、マップが大きくなるにつれて行われるすべての割り当てに使用されます。新しいノードはそれぞれ、単一の割り当てで割り当てられます。

標準

私は C++11 標準をチェックしましたが、そのような構造をどのように割り当てるかを指定するものは見つかりませんでした。適切な部品が見つからなかったか、指定されていません。ただし、ユーザー指定のアロケーターの種類を使用しないのは、少し無意味に思えます。

于 2013-07-21T17:41:11.447 に答える