struct
是否可以使用按位复制与or标记无关class
,仅取决于是否表示struct
or class
is_trivially_copiable
。它们是否在标准(9/6 [类])中定义,它基本上归结为不必声明除构造函数之外的任何其他特殊成员方法。
然后在 3.9/2 [basic.types] 中的标准允许按位复制
对于普通可复制 type 的任何对象(基类子对象除外)T
,无论该对象是否拥有 type 的有效值T
,构成该对象的底层字节(1.7)都可以复制到char
or的数组中unsigned char
。char
如果or的数组的内容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);