首页 > 解决方案 > std::memmove 在同一个对象之间总是安全的吗

问题描述

std::memmove在相同的对象实例(包括子对象)之间总是安全的。

也就是说,对于 anyT和 any来说,以下是安全的t,并且它会t保持不变:

template <typename T>
void maybe_copy(T& t) {
  std::memmove(&t, &t, sizeof(T));
}

作为一个必然的问题,以下内容是否总是安全的:

template <typename T>
void redundant_copy(T& s, const T& d) {
  if (std::addressof(s) == std::addressof(d)) {
    std::memmove(&d, &s, sizeof(T));
  }
}

标签: c++language-lawyermemmove

解决方案


不,它并不总是安全的。

来自https://en.cppreference.com/w/cpp/string/byte/memmove

如果对象可能重叠或不是TriviallyCopyable,则 的行为memmove未指定并且可能未定义

什么是潜在重叠?
来自https://en.cppreference.com/w/cpp/language/object#Subobjects

一个子对象可能是重叠的,如果它是

. 基类子对象,或
. 使用 [[ no_unique_address ]] 属性声明的非静态数据成员。

我假设我不需要在这个答案中发布TriviallyCopyable的定义。


推荐阅读