3

TBB Concurrent Vector は、grow_by と grow_to_at_least を使用して動的にサイズ変更できます。また、STL Vector にはサイズ変更機能もあります。違いは何ですか?

私が遭遇した違いは

1. 配列がクリアされるまで、concurrent_vector は決して要素を移動しません。これは、シングルスレッド コードであっても、STL std::vector (要素を移動してベクトルのサイズを変更できる) よりも有利な場合があります。

2. 他のアクセスが実行中 (または実行中の可能性がある) のときに動的にサイズ変更する必要がある場合、または要素が移動しないようにする必要がある場合にのみ、concurrent_vector を使用します。

私はこれで混乱しているので、誰でもこれらの点を説明できますか?

4

1 に答える 1

4

これは、concurrent_vector にメモリが割り当てられると、それが常に使用されることを意味します。 std::vector は、不足したときに 2 倍のメモリを割り当て、格納されているオブジェクトを新しく割り当てられたブロックに移動します。

私が思うに、 concurrent_vectorは新しいメモリ ブロックを追加していますが、古いブロックを使い続けています。オブジェクトを移動しないことは重要です。これにより、サイズが変更されている場合でも、他のスレッドがベクトルにアクセスし続けることができます。おそらく、他の最適化 (キャッシュされたコピーを有効に保つなど) にも役立ちます。欠点は、最初に正しいブロックを見つける必要があるため、要素へのアクセスがわずかに遅くなることです (1 つの余分な考慮事項です)。

std::vector メモリ割り当ての説明は次のとおりです: std::vectorで動的メモリはどのように管理されますか?

于 2013-04-09T10:49:18.600 に答える