10

私は読んでいました C++アロケーターに再割り当て機能がないのはなぜですか? 実行時にヒープ上に配列を作成し、必要に応じてより多くの領域を割り当てることは可能ですか? 、オブジェクトの動的配列の再割り当てが不可能であることを明確に述べています。

ただし、 Josuttis によるC++ 標準ライブラリでは、Allocator には次の構文allocatorの関数があると記載されています。allocate

pointer allocator::allocate(size_type num, allocator<void>::pointer hint = 0)

ここで、hintには実装定義の意味があり、パフォーマンスを向上させるために使用できます。

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

4

3 に答える 3

4

Visual Studio 2010-2013 で std::allocator を使用してヒントを使用して、 plf::colony C++ コンテナー内の小さなスカラー型の反復時間のパフォーマンスを大幅に向上させ (反復速度が最大 21% 向上)、GCC で大幅に高速化しました。 5.1. したがって、これらのコンパイラと std::allocator を使用すると、違いが生じると言っても過言ではありません。ただし、違いはコンパイラに依存します。ヒントを無視するアロケーターとヒントを観察するアロケーターの比率はわかりません。

于 2015-10-03T02:24:34.927 に答える
2

特定の実装についてはわかりませんが、アロケータは に渡される前にヒント ポインタの値を返すことは許可されていないことに注意してくださいdeallocate。そのため、 を形成するためのプリミティブ操作として使用することはできませんreallocate

標準では、ヒントは への以前の呼び出しによって返されたに違いないと述べていますallocate。「[ヒント] の用途は特定されていませんが、地域性を支援することを目的としています」と書かれています。したがって、1 つのスレッドで同様のサイズの一連のブロックを割り当てて解放する場合は、マイクロプロセッサ キャッシュ間のキャッシュ競合を避けるために、以前に解放した値を渡すことができます。

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

于 2013-03-13T09:09:14.310 に答える
1

C++11 は、20.6.9.1 アロケーター メンバーで次のように述べています。

4 - [注:コンテナー メンバー関数では、多くの場合、隣接する要素のアドレスをhint引数として渡すのが適切です。—終わりの注]
[...]
6 - [...] の使用hintは指定されていませんが、実装が望む場合に局所性を支援することを目的としています。

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

于 2013-03-13T09:06:33.303 に答える