【发布时间】: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