c++ - 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));
}
}
解决方案
不,它并不总是安全的。
来自https://en.cppreference.com/w/cpp/string/byte/memmove
如果对象可能重叠或不是TriviallyCopyable,则 的行为
memmove
未指定并且可能未定义。
什么是潜在重叠?
来自https://en.cppreference.com/w/cpp/language/object#Subobjects
一个子对象可能是重叠的,如果它是
. 基类子对象,或
. 使用 [[ no_unique_address ]] 属性声明的非静态数据成员。
我假设我不需要在这个答案中发布TriviallyCopyable的定义。
推荐阅读
- sqlite - 重复一个命令 while true 或 x 次(相当于 while/for 循环)
- php - 如何将 Laravel 中的远程文件下载到服务器?
- ios - 如何为 UITableView 部分创建自定义背景?
- javascript - Sharepoint Web 部件元素中未捕获的 ReferenceError
- php - 使用 whereHas 查询数组
- php - 无法使用带有 iframe 的 google docs api 显示 doc 文件
- amazon-web-services - 自动开启和关闭redis集群
- c# - 更改 appsettings.json 中的日志级别不会应用于 NLog
- vb.net - 从一个字节中获取前三位
- jinja2 - 如何在 argo 工作流程中转义“{{”和“}}”