0

memcpy型が自明にコピー可能でない限り、つまりstd::is_trivially_copyable型特性を満たさない限り、値をコピーしても安全ではないようです。std::is_trivially_copy_assignable型特性、std::is_trivially_copy_constructiblestd::is_trivially_move_assignableおよびstd::is_trivially_move_constructibleを使用して初期化または割り当てに利用できない場合、その目的は何なのだろうかmemcpy。それらは他の最適化を許可しますか?

また、値を .xml でコピーできるようにするために、なぜ標準が単純なデストラクタを必要とするのか疑問に思いますmemcpy。(単純なデストラクタは、メモリ内の値を物理的に移動することを単純化しますが、単に値を複製するために基本的に必要ではないようですmemcpy)。

4

3 に答える 3

3

std::is_trivially_copy_assignable型特性, std::is_trivially_copy_constructible,std::is_trivially_move_assignableの目的は何だろうかstd::is_trivially_move_constructible.memcpy

それらはタイプのプロパティを教えてくれますが、それは存在する十分な理由ではありませんか?

自明なコピー コンストラクターと非自明なムーブ コンストラクターを持つ型が存在する可能性があるため、自明にコピー可能な型としての資格はありませんが、自明にコピー構築可能です。

このような型を使用する場合、SFINAE またはその他の静的ポリモーフィズムを使用して、自明であることが保証されていない限り、特定の操作を有効/無効にすることができます。たとえば、ムーブ コンストラクターを削除済みとして宣言できるクラス テンプレートを想像してみてTrivialPair<A,B>ください。つまり、自明でない関数をサポートする操作と呼び出さない操作の両方をサポートする操作のみをサポートします。ABTrivialPairAB

また、値をコピー可能にするために標準が単純なデストラクタを必要とする理由も疑問に思いますmemcpy

「簡単にコピー可能」とは、型が単なるバイトの集まり、つまり値を変更せずにメモリ内の別の場所に安全にコピーできる単なるデータであると考えることができます。型に自明でないデストラクタがある場合、それは単なるバイトの集まりではなく、コンパイラが理解できない追加の動作があり、使用がmemcpy安全でなくなる可能性があります。

于 2012-10-13T21:25:04.943 に答える
1

もちろん。安全な場合には、これを利用して std::memcpy をそのコピー コンストラクターで呼び出すベクトル クラス テンプレートを作成できます。std::copy の少なくとも 1 つの実装では、反復子が T* 型で、T が自明にコピー可能な場合に同様の最適化を採用していると思います。

于 2012-10-13T21:18:50.873 に答える