在什么条件下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),我也想知道。
请注意,T
满足TriviallyCopyable (TC) 概念是不够的,如本例所示。base
是 TC 但不是 memcpy 安全的(由于对派生类的成员重复使用填充)。
如果单独存在任何T
充分(且不一定是必要)的条件,而不需要src
和dest
(通常不能静态确定)的条件,我特别感兴趣。
1具体来说,我的假设是,如果它们确实T
重叠,那么在与 for相同的条件下,它们仍然可以安全地复制std::memcpy
,但可以std::memmove
改为使用。如果假设不正确,它可能是答案的一部分。