2

私の理解ではstd::copy、要素を一度に1つずつコピーします。これは、各要素でコンストラクターをトリガーするために必要なようです。memcpyしかし、そのようなコンストラクター(PODなど)が存在しない場合は、aの方がはるかに効率的だと思います。

それで、STLは、たとえば、vector<int>コピーの特殊化を要求/許可しますmemcpyか?
以下の質問は、私が使用しているコンパイラであるため、GCC/MSVCの両方について回答していただければ幸いです。

  1. 許可されているが必須ではない場合、上記のコンパイラは実際にそれを実行しますか?
  2. もしそうなら、これはどのコンテナに対してトリガーされますか?明らかにそれは意味がありませんlistが、どうstringですかdeque
  3. 繰り返しますが、もしそうなら、どのタイプが含まれているのでこれがトリガーされますか?組み込みタイプのみ、または私自身のPODタイプ(例struct Point {int x, y;})?
  4. そうでない場合は、整数/文字/自分の構造体配列などに使用するnew//deleteポインターの周りに自分のラッパーを使用する方が速いでしょうか?memcpy
4

1 に答える 1

7

まず、std::copy何もコピー構築しません。(それがアルゴリズムの仕事になりますstd::uninitialized_copy。)代わりに、古い範囲の各要素に対応する新しい値を割り当てます。

第二に、確かに、コンパイラは、結果が要素ごとの割り当てを実行したのと「あたかも」同じである限り、割り当てをmemcopyに最適化することができます。GCCは、たとえば、このような自明なコピー可能な型を認識するコンパイラサポートを持つことによってこれを行い、C ++ 11は実際に、メモリコピーできるstd::is_trivially_copyable型に正確に当てはまるという新しい型特性を追加します。

于 2012-05-20T12:51:44.817 に答える