使用std :: memcpy在内存中移动对象

use*_*108 3 c++ c++11

是否允许将类实例对象从一个位置移动到另一个位置(例如,通过使用std::memcpystd::memove?假设源位置和目标位置具有相同的对齐方式.然后将目标"object"转换为源对象的类型并调用它.C++ 11标准的哪一部分禁止这个?

Jac*_*ack 7

您应该考虑is_trivially_copyableC++ 11提供的模板,它有助于了解它对memcpy给定类型是否安全.如果该值是,false则结果未定义.


bil*_*llz 5

只要它们是可以复制的,它就是安全的.

§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
Run Code Online (Sandbox Code Playgroud)

§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
Run Code Online (Sandbox Code Playgroud)