c++ - 是std::memomove在同一对象之间始终是安全的

标签 c++ language-lawyer memmove

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

也就是说,以下对于任何Tt是安全的,并且将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));
  }
}

最佳答案

不,它并不总是安全的。

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

If the objects are potentially-overlapping or not TriviallyCopyable, the behavior of memmove is not specified and may be undefined.



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

A subobject is potentially overlapping if it is either

. a base class subobject, or
. a non-static data member declared with the [[no_unique_address]] attribute.



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

关于c++ - 是std::memomove在同一对象之间始终是安全的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59852748/

相关文章:

c++ - 如何乘以 2 个大数?

c++ - 如何使用 IFileOperation 清空文件夹

c++ - 一个普通的 `char` 可能有陷阱值吗?

c - memcpy 与 C 中的赋值——应该是 memmove?

c++ -/是否/memmove 使用中间缓冲区?

c++ - C++ 中成员函数返回函数指针的语法

c++ - Credential Provider 和系统服务之间的 IPC

c++ - 只要不包含单个标题,重新定义 C++ 关键字是否合法?

c++ - 删除与析构函数的显式调用

c++ - 是否有与 memmove 等效的标准库?