gpt4 book ai didi

c++ - 为什么是 "move semantics"而不是简单的 memcpy?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:27:59 24 4
gpt4 key购买 nike

给定以下代码:

typename std::aligned_storage<sizeof(T), alignof(T)>::type storage_t;

//this moves the back of src to the back of dst:
void push_popped(std::list<storage_t> & dstLst, std::list<storage_t> & srcLst)
{
auto & src = srcLst.back();
dstLst.push_back(storage_t());
auto & dst = dstLst.back();
std::memcpy(&dst, &src, sizeof(T));
srcLst.pop_back();
}

我知道这种方法通常不正确的 3 个原因(即使它避免调用 src->~T() 并因此避免双重回收 T 的资源)。

  1. U* 类型的对象成员指向其他U同一对象的成员
  2. 隐藏的类成员可能需要更新(例如 vtable)
  3. 系统需要记录没有T不再存在于 src那一个T现在存在于 dst

(这里提到了这些:http://www.gamedev.net/topic/655730-c-stdmove-vs-stdmemcpy/#entry5148523。)

假设T不是一种类型,其内存地址是其状态的属性(例如 std::mutexstd::condition_variable),这些是这种方法的唯一问题吗?或者还有其他可能出错的地方吗?我想要对未知问题的描述。

我想认为我开发了“对象重定位语义”,但如果其中有明显的漏洞,我宁愿不要求人们考虑它。

最佳答案

“平凡可复制”的概念意味着 memcpy 是安全的。您可以通过 std 中的特征测试一个类型是否可简单复制。

它包括销毁它是一个空洞的想法;在你的情况下,你希望破坏不是空洞的,而是不在源头上完成,而在目标上完成。

“移动并销毁源代码”的概念已在 C++1z 标准化过程中独立于“平凡可复制”概念提出。它是为异常安全而提出的;有些类型的移动构造不是异常安全的,但移动构造和销毁源是。并且存在涉及异常和容器分配的棘手问题,这使得 noexcept move-ctor 操作非常有值(value)。

如果这进入标准,那么如果证明有值(value),也可以将平凡可复制的如果你不销毁源概念添加到标准中。

它不适用于移动语义可以增强的所有内容,并且它可能需要程序员的努力(编译器如何计算出“可以删除破坏者”并不容易;所有图灵机行为的非平凡非结构属性是棘手的。)

关于c++ - 为什么是 "move semantics"而不是简单的 memcpy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32352862/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com