2013-03-13 5 views
8

私はWhy is there no reallocation functionality in C++ allocators?Is it possible to create an array on the heap at run-time, and then allocate more space whenever needed?を読んでいました。これは、オブジェクトの動的配列の再割り当てが不可能であることを明確に示しています。しかしながら割り当てヒントが使用されますか?

にC++標準ライブラリ Josuttis氏によって、それは、アロケータを述べallocator、次の構文

hintがあってもよい実装定義された意味を有する
pointer allocator::allocate(size_type num, allocator<void>::pointer hint = 0) 

と機能allocateを有しますパフォーマンスの向上に役立ちます。

これを利用する実装はありますか?

答えて

1

20.6.9.1アロケータメンバーにC++ 11個の状態、

4 - [容器メンバ関数において、隣接する要素のアドレスが頻繁に良い選択でありますhint引数を渡します。 - エンドノート]
[...]
6 - [...] hintの使用が指定されていないが、欲望ので、実装であれば、地域への援助 として意図しました。

メモリ内の既存の要素に隣接して、または近くに新しい要素を割り当てると、ローカリティを改善してパフォーマンスを向上させることができます。それらは通常一緒にキャッシュされるので、近くの要素はメモリ階層の上を一緒に移動する傾向があり、互いに追い出されることはありません。

+0

ああ、既存のオブジェクトを再割り当てするのではなく、オブジェクトを隣り合わせに割り当てるのですか? –

+0

次のアドレスを渡すだけではありません。ヒントは前の 'allocate'呼び出しから得られたものでなければなりません。 – Potatoswatter

1

特定の実装についてはわかりませんが、アロケータはdeallocateに渡される前にヒントポインタの値を返すことはできません。したがって、reallocateを形成するための基本的な操作として使用することはできません。

標準では、allocateへの前回の呼び出しでヒントが返されている必要があるとしています。それは「ヒントの使用は不明だが、 は地域への援助として意図されている」と述べている。したがって、1つのスレッドで同様のサイズのブロックのシーケンスを割り当てたり解放したりする場合は、解放された値を渡して、マイクロプロセッサキャッシュ間のキャッシュ競合を避けることができます。

それ以外の場合は、CPU AがまだCPU Aのキャッシュにあるメモリアドレスを使用していることがわかると(メモリにもC++によって破棄されたオブジェクトが含まれていても)、そのバスに迷惑データを転送する必要があります。 CPU AとBがキャッシュされたそれぞれのアドレスを再利用するようにするのがよいでしょう。

2

plf::colony C++コンテナのVisual Studio 2010-2013でstd :: allocatorのヒント(反復速度が〜21%向上)を使用した小スカラー型の反復時間に大きなパフォーマンス上の利点があります。 GCC 5.1。だから、これらのコンパイラとstd :: allocatorを使うと違いがあると言うのは安全です。しかし、その違いはコンパイラに依存します。私は、ヒント無視のヒントを観測するアロケータの割合を認識していません。

関連する問題