Bee*_*ope 4 c++ memcpy language-lawyer object-layout
在什么条件下可以安全地std::memcpy
从一个对象复制到另一个对象?
例如,什么样的条件必须T
,src
并dest
满足是安全的以下内容:
template <typename T>
void copy_bytewise(T& dest, const T& src) {
std::memcpy(&dest, &src, sizeof(T));
}
Run Code Online (Sandbox Code Playgroud)
我们可以假设的唯一的事情src
和dest
是他们不重叠1。特别是,src
或者dest
可以是对成员或基类的引用。
我对参考标准的答案很感兴趣,但是如果这与通常的做法不同(例如,Itanium 的事实上的 C++ ABI),我也想知道。
请注意,如本示例所示,T
满足TriviallyCopyable (TC) 概念是不够的。是 TC 但不是 memcpy 安全的(由于对派生类的成员重复使用填充)。base
我特别感兴趣的是,如果有任何T
单独的条件是充分的(不一定是必要的),而不需要条件src
和dest
(通常不能静态确定)。
1具体来说,我的假设是,如果它们确实重叠,它们在T
与 for相同的条件下仍然可以安全地复制std::memcpy
,但使用std::memmove
代替。如果假设不正确,它可能是答案的一部分。
对于任何可简单复制的类型
T
,如果两个指针T
指向不同的T
对象obj1
和obj2
,其中既不是基类子对象obj1
也不obj2
是基类子对象,如果构成的底层字节([intro.memory])obj1
被复制到 中obj2
,则obj2
随后将保持与obj1
.
简而言之:
T 必须满足什么条件才能保证以下安全
T
必须是可简单复制的;这是唯一T
必须满足的条件。另一个要求不是限制T
,而是限制可能被复制的对象的性质。这意味着它不是您可以静态确定的。
归档时间: |
|
查看次数: |
385 次 |
最近记录: |