ビット単位のコピーを使用できるかどうかは、struct
またはタグとは関係がなく、言われたかclass
どうかにのみ依存します。それらが標準(9/6 [class])で定義されているかどうかは、基本的に、コンストラクター以外の特別なメンバーメソッドを宣言する必要がないということです。struct
class
is_trivially_copiable
その後、ビット単位のコピーは3.9 /2[basic.types]の標準で許可されます。
自明にコピー可能な型のオブジェクト(基本クラスのサブオブジェクトを除く)のT
場合、オブジェクトが型の有効な値を保持しているかどうかに関係なく、オブジェクトをT
構成する基になるバイト(1.7)をまたはの配列にコピーできchar
ますunsigned char
。char
またはの配列の内容がunsigned char
オブジェクトにコピーバックされた場合、オブジェクトはその後元の値を保持する必要があります。[例:
#define N sizeof(T)
char buf[N];
T obj; // obj initialized to its original value
std::memcpy(buf, &obj, N); // between these two calls to std::memcpy,
// `obj` might be modified
std::memcpy(&obj, buf, N); // at this point, each subobject of `obj`
// of scalar type holds its original value
—例を終了]
注:パディングバイトのビット単位のコピーは、Valgrindのレポートにつながります。
std::copy
同じ効果に使用する:
char const* b = reinterpret_cast<char const*>(&obj);
std::copy(b, b + N, buf);