24

std::vector<std::uint8_t>複製する必要があります。これは、コピー コンストラクターを呼び出すだけで実行できます。

私のプロファイリング結果は、Microsoft Visual C++ (msvc100) 実装がstd::uninitialized_copy内部で使用していることを示しています。これにより、すべての要素が 1 つずつコピーされます。この場合、メモリのブロック全体を一度にコピーすることで、より最適化されたコピーを実行できます (memcpyそうかもしれません)。

つまり、これは大幅な最適化になる可能性があります。ベクターにそのような最適化された方法を強制的に使用させる方法はありますか?

注: を使用してみstd::basic_string<std::uint8_t>ましたが、パフォーマンスは向上していますが、他にも問題があります。

4

2 に答える 2

7

この回答は、msvc100 に固有のものではありません。

のようにコピーコンストラクタを使用する場合

std::vector<uint8_t> newVect(otherVect);

otherVect のアロケータ オブジェクトもコピー (および使用) する必要があり、STL 実装でパフォーマンスを向上させるにはさらに努力が必要です。

otherVectの内容をコピーするだけの場合は、

std::vector<uint8_t> newVect(otherVect.begin(), otherVect.end());

newVect のデフォルトのアロケータを使用します。

別の可能性は

std::vector<uint8_t> newVect; nevVect.assign(otherVect.begin(), otherVect.end());

この場合、それらのすべて (otherVect がデフォルトのアロケーターを使用する場合のコピー コンストラクターを含む) は、適切な STL 実装で memmove/memcpy に要約する必要があります。otherVect が newVect とまったく同じ要素タイプ (「char」や「int8_t」などではない) を持つことに注意してください。

一般に、コンテナーのメソッドを使用する方が一般的なアルゴリズムを使用するよりもパフォーマンスが高いため、ベンダーがそうしなかった場合は、 vector::resize() と std::copy() または memmove()/memcpy() の組み合わせが回避策になります。コンテナを十分に最適化しません。

于 2013-04-12T08:22:58.827 に答える