在什么条件下使用 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),我也想知道。

请注意,满足 TriviallyCopyable (TC) 概念的 T 是不够的,如 this example 所示。 base 是 TC 但不是 memcpy 安全的(由于对派生类的成员重复使用填充)。

如果 T 上有任何条件是足够的(不一定是必要的),而不需要 srcdest 上的条件(通常不能静态确定),我特别感兴趣。

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

最佳答案

来自 [basic.types]/3:



简而言之:


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

关于c++ - 在什么条件下使用 std::memcpy 在对象之间进行复制是安全的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59852054/

10-11 23:05
查看更多