5

C++11 標準では、バイトごとのコピーが POD 型に対して常に有効であることが保証されています。しかし、特定の自明な型についてはどうでしょうか。

次に例を示します。

struct trivial
{
  int x;
  int y;
  trivial(int i) : x(2 * i) { std::cout << "Constructed." << std::endl; }
};

この構造体をバイト単位でコピーした場合、技術的には POD ではありませんが、適切にコピーされることが保証されますか? オブジェクトをバイトコピーしてはいけないという線引きはいつですか?

4

3 に答える 3

9

はい、正しくコピーされることが保証されています。

FDIS を引用すると、§3.9/2:

自明にコピー可能な type のオブジェクト (基本クラスのサブオブジェクト以外) についてTは、オブジェクトが type の有効な値を保持しているかどうかにかかわらず、オブジェクトTを構成する基になるバイトをcharまたはの配列にコピーできますunsigned charcharまたはの配列の内容がunsigned charオブジェクトにコピーされた場合、オブジェクトはその後元の値を保持します。

そして§3.9/3:

自明にコピー可能な型 についてT、2 つのポインタが別個のオブジェクトおよびをT指す場合、どちらも基本クラスのサブオブジェクトではない場合、構成する基礎となるバイトが にコピーされる場合、その後 と同じ値を保持するものとします。Tobj1obj2obj1obj2obj1obj2obj2obj1

したがって、あなたが求めている要件は、§3.9/9 です。

算術型、列挙型、ポインター型、メンバー型へのポインターstd::nullptr_t、およびこれらの型の cv 修飾バージョンは、まとめてスカラー型と呼ばれます。スカラー型、POD クラス、そのような型の配列、およびこれらの型のcv 修飾バージョンは、総称してPOD 型と呼ばれます。スカラー型、自明にコピー可能なクラス型、そのような型の配列、およびこれらの型の cv 修飾バージョンは、まとめて自明にコピー可能な型と呼ばれます。

そして§9/6:

自明にコピー可能なクラスとは、次のようなクラスです。

  • 自明でないコピー コンストラクターを持たず、
  • 重要なムーブ コンストラクタがなく、
  • 自明でないコピー代入演算子を持たず、
  • 重要な移動代入演算子がなく、
  • 自明なデストラクタがあります。
于 2011-09-24T00:48:00.563 に答える
5

C++11 では、POD 型の定義がより有用なカテゴリ、特に「自明」と「標準レイアウト」に分割されました。あなたの例は標準的なレイアウトであり、簡単にコピーできますが、コンストラクターによって完全に簡単になることはできません。自明にコピー可能な型は、安全にバイト単位でコピーされることが保証されています。

自明にコピー可能な型 T の任意のオブジェクト (基本クラスのサブオブジェクト以外) については、オブジェクトが型 T の有効な値を保持しているかどうかにかかわらず、オブジェクトを構成する基礎となるバイト (1.7) を char またはの配列にコピーできます。 unsigned char.40 char または unsigned char の配列の内容がオブジェクトにコピーされた場合、オブジェクトはその後元の値を保持する必要があります。

いいえ、POD ステータスをそのように安全にコピーする必要はありませんが、可能な非 POD タイプのサブセットを特定することは可能です。

于 2011-09-24T00:53:38.763 に答える
3

標準がPODタイプに対してのみ定義されていると述べている場合(C++ 11標準をまだ詳細に調べていないので、競合が正しいかどうかはわかりません(a))、非のためにそれを行いますPOD タイプで、動作が定義されていません。限目。

一部の実装では、惑星が整列している 1 日の特定の時間に一部の環境で機能する場合があります。ほとんどの場合は機能する可能性があります。移植性を重視する場合、それでも良い考えにはなりません。


(a)さらに調査した結果、あなたの特定のケースは問題ないようです。標準のセクション 3.9/3 ( n3242 ドラフトですが、この後期ドラフトから大幅に変更されていた場合は驚くでしょう) は次のように述べています。

自明にコピー可能な型 T について、T への 2 つのポインターが異なる T オブジェクト obj1 および obj2 を指している場合、obj1 も obj2 も基本クラスのサブオブジェクトではない場合、obj1 を構成する基礎となるバイトが obj2 にコピーされる場合、obj2 はその後同じものを保持するものとします。 obj1 としての値。

セクション 9 では、「自明にコピー可能」とは何を意味するかを (高レベルで) 定義しています。


自明なコピー可能クラスとは、次のようなクラス
です

- 自明でない移動代入演算子がなく (13.5.3、12.8)、
- 自明なデストラクタがある (12.4)。

12.8参照セクションでは、クラス オブジェクトのコピーと移動、および割り当てについて、各領域の詳細を説明しています13.5.3

于 2011-09-24T00:39:03.047 に答える