在什么条件下使用是安全的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) 概念还不够,如 this example显示。 base
是 TC 但不是 memcpy 安全的(由于对派生类的成员重复使用填充)。如果
T
上有任何条件,我特别感兴趣仅此一项就足够了(不一定是必要的),而不需要 src
上的条件和 dest
(通常不能静态确定)。1 具体来说,我的假设是,如果它们确实重叠,它们在
T
上的相同条件下仍然可以安全复制。至于std::memcpy
,但使用 std::memmove
反而。如果假设不正确,它可能是答案的一部分。
最佳答案
For any trivially copyable type
T
, if two pointers toT
point to distinctT
objectsobj1
andobj2
, where neitherobj1
norobj2
is a base-class subobject, if the underlying bytes ([intro.memory]) making upobj1
are copied intoobj2
,obj2
shall subsequently hold the same value asobj1
.
简而言之:
what conditions must T satisfy for the following to be safe
T
必须是可简单复制的;这是唯一的条件 T
必须满足。另一个要求不是对 T
的限制,但对可能被复制的对象的性质有限制。这意味着它不是您可以静态确定的。
关于c++ - 在什么条件下使用 std::memcpy 在对象之间进行复制是安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59852054/