在什么条件下使用 std::memcpy 在对象之间复制是安全的?

Under what conditions is it safe to use std::memcpy to copy between objects?

本文关键字:复制 之间 安全 对象 条件下 std memcpy 在什么      更新时间:2023-10-16

在什么条件下使用std::memcpy从一个对象复制到另一个对象是安全的?

例如,必须满足Tsrcdest哪些条件才能确保以下各项安全:

template <typename T>
void copy_bytewise(T& dest, const T& src) {
std::memcpy(&dest, &src, sizeof(T));
}

关于srcdest,我们唯一可以假设的是它们不与1重叠。特别是srcdest中的任何一个都可以是对成员或基类的引用。

我对涉及该标准的答案感兴趣,但如果这与通常的做法不同(例如,来自 Itanium 的事实上的 C++ ABI(,我也想知道。

请注意,T满足简单可复制(TC( 概念是不够的,如此示例所示。base是 TC 但不是 memcpy-安全的(由于对派生类的成员重用填充(。

我特别感兴趣,如果单独T有任何条件是足够的(不一定是必要的(,而不需要srcdest的条件(一般来说,不能静态确定(。


1具体来说,我的假设是,如果它们确实重叠,它们仍然可以在与std::memcpy相同的条件下T复制,但改用std::memmove。如果假设不正确,它可能是答案的一部分。

From [basic.types]/3:

对于任何平凡可复制的类型T,如果指向T的两个指针指向不同的T对象obj1obj2,其中obj1obj2都不是基类子对象,如果构成obj1的底层字节([intro.memory](被复制到obj2中,obj2随后应保持与obj1相同的值。

总之:

必须满足哪些条件才能确保以下安全

T必须是微不足道的可复制的;这是T必须满足的唯一条件。另一个要求不是对T的限制,而是对可能被复制的对象的性质的限制。这意味着这不是你可以静态确定的东西。