4

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

例如,必须满足什么条件才能T保证以下安全srcdest

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

我们唯一可以假设srcdest是它们不重叠1。特别是其中之一srcdest可能是对成员或基类的引用。

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

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

如果单独存在任何T充分(且不一定是必要)的条件,而不需要srcdest(通常不能静态确定)的条件,我特别感兴趣。


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

4

1 回答 1

5

来自[basic.types]/3:

对于任何可简单复制的类型T,如果两个指针T指向不同的T对象obj1obj2,其中既不是基类子对象obj1也不obj2是基类子对象,如果组成的基础字节([intro.memory])obj1被复制到obj2,则obj2随后应保持与obj1.

简而言之:

必须满足哪些条件才能使以下内容安全

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

于 2020-01-22T03:50:08.327 回答