是否允许将类实例对象从一个位置移动到另一个位置(例如,通过使用std::memcpy
or std::memove
?假设源位置和目标位置具有相同的对齐方式。然后将目标“对象”转换为源对象的类型并调用它。C++11 标准的哪一部分禁止这样做?
问问题
942 次
2 回答
7
您应该考虑is_trivially_copyable
C++11 提供的模板,该模板有助于了解它对memcpy
给定类型是否安全。如果值为,false
则结果未定义。
于 2013-07-13T00:01:00.187 回答
5
只要它们是is_trivially_copyable,它就是安全的。
§ 3.9.2
对于普通可复制类型 T的任何对象(基类子对象除外),无论该对象是否拥有 T 类型的有效值,构成该对象的底层字节(1.7)都可以复制到 char 或unsigned char.40 如果将 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
§ 3.9.3
对于任何可简单复制的类型 T,如果指向 T 的两个指针指向不同的 T 对象 obj1 和 obj2,其中 obj1 和 obj2 都不是基类子对象,如果构成 obj1 的基础字节 (1.7) 被复制到 obj2,41 obj2随后应保持与 obj1 相同的值。[ 例子:
T* t1p;
T* t2p;
// provided that t2p points to an initialized object ...
std::memcpy(t1p, t2p, sizeof(T));
// at this point, every subobject of trivially copyable type in *t1p contains
// the same value as the corresponding subobject in *t2p
于 2013-07-13T00:15:12.763 回答