【问题标题】:Is std::memmove always safe between the same objectstd::memmove 在同一个对象之间总是安全的吗
【发布时间】:2020-05-08 04:50:23
【问题描述】:

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

也就是说,对于任何T 和任何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));
  }
}

【问题讨论】:

  • en.cppreference.com/w/cpp/string/byte/memmove 提到了函数可能导致未定义行为的情况。这不能回答你的问题吗?
  • @RSahu - 不,它不适用,因为它适用于任意复制操作,而不适用于对象是同一对象的非常有限的情况。特别是,标准中有各种示例,当字节从对象复制到 char 缓冲区中,然后再返回时,应用了一些特殊条件,因此这种情况通常是不同的。

标签: c++ language-lawyer memmove


【解决方案1】:

不,它并不总是安全的。

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

如果对象是potentially-overlapping或不是TriviallyCopyable,则memmove的行为未指定,may be undefined

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 2015-11-21
    相关资源
    最近更新 更多