c++ - 在什么条件下使用 std::memcpy 在对象之间进行复制是安全的?

标签 c++ language-lawyer memcpy object-layout

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

比如什么条件必须T , srcdest满足以下条件是安全的:

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反而。如果假设不正确,它可能是答案的一部分。

最佳答案

来自 [basic.types]/3:

For any trivially copyable type T, if two pointers to T point to distinct T objects obj1 and obj2, where neither obj1 nor obj2 is a base-class subobject, if the underlying bytes ([intro.memory]) making up obj1 are copied into obj2, obj2 shall subsequently hold the same value as obj1.



简而言之:

what conditions must T satisfy for the following to be safe


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

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

相关文章:

c++ - CMake:使用项目安装 boost 组件库的正确方法

c++ - 为什么多线程会吃掉我的内存

c++ - #ifdef 带有多个标记,这合法吗?

c++ - 为什么 volatile 对象不能调用非 volatile 成员函数

c - 如何获取 C 宏中声明的变量的地址?

C++ 链接器问题,未解析的外部符号与我自己的代码

c++ - qt小部件位置

constraints - 三元关联相关的属性

c++ - 将模板指针传递给 memcpy

c - 在内存中排序值时重新分配的最有效方法?