在什么条件下使用 std::memcpy
从一个对象复制到另一个对象是安全的?
例如, T
、 src
和 dest
必须满足哪些条件才能保证安全:
template <typename T>
void copy_bytewise(T& dest, const T& src) {
std::memcpy(&dest, &src, sizeof(T));
}
关于
src
和 dest
,我们唯一可以假设的是它们不重叠1。特别是 src
或 dest
中的任何一个都可以是对成员或基类的引用。我对引用标准的答案很感兴趣,但如果这与通常的做法不同(例如,Itanium 的事实上的 C++ ABI),我也想知道。
请注意,满足 TriviallyCopyable (TC) 概念的
T
是不够的,如 this example 所示。 base
是 TC 但不是 memcpy 安全的(由于对派生类的成员重复使用填充)。如果
T
上有任何条件是足够的(不一定是必要的),而不需要 src
和 dest
上的条件(通常不能静态确定),我特别感兴趣。1 具体来说,我的假设是,如果它们确实重叠,在
T
与 std::memcpy
相同的条件下,它们仍然可以安全地复制,但使用 std::memmove
代替。如果假设不正确,它可能是答案的一部分。 最佳答案
来自 [basic.types]/3:
简而言之:
T
必须是可简单复制的;这是 T
必须满足的唯一条件。另一个要求不是对 T
的限制,而是对可能被复制的对象的性质的限制。这意味着它不是您可以静态确定的。
关于c++ - 在什么条件下使用 std::memcpy 在对象之间进行复制是安全的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59852054/