【问题标题】:Are there more than two benefits of move semantics?移动语义有两个以上的好处吗?
【发布时间】:2017-04-10 23:28:20
【问题描述】:

我正在尝试更全面地了解何时实施移动语义,我相信它与好处交织在一起。

到目前为止,我知道有两个。

  1. 在移动对象时保存两个可能代价高昂的操作(当知道源将很快消失且不被使用时进行复制),如果不移动一个完整的副本并且会执行一个完整的析构函数,移动将保存一个原子原子引用计数对象的递增和递减,位图的深层副本或指针持有的其他数据结构,或文件句柄的副本,其中一个将被关闭,或任何其他“复制”和“破坏”对/p>

  2. 实现无法复制(如重复)但可以移动的对象,确保只有一个对象具有相同的内容,但该对象可以移交给函数。例如。 unique_ptr 或任何无法或不需要复制但需要在一个地方创建但在其他地方使用的对象。

两者的区别在于第一个处理性能,第二个处理防止语义复制。

我的问题是,为一个类实现移动语义还有其他用途或优势吗?除了性能或确保只有一个位置包含对象的实时副本之外的考虑因素。

【问题讨论】:

    标签: c++ c++11 move-semantics


    【解决方案1】:

    当您在某些上下文中move 容器时,指针、引用和迭代器会随之移动。当你复制它时,它们不会。这既不是表演,也不是不可移动的物体;相反,move 提供的保证与copy 不同。

    只要你有任何引用,比如谈论复杂对象的“内部”,这也可以成立。 move 逻辑上可以使参考旅行,而 copy 可能不会。

    【讨论】:

    • 听上去很有趣,但我完全看不懂。你能提供更多细节吗?一个很好的例子,如何实现它,你什么时候想要,当你不确定你在说什么时会发生什么。
    • @martin 你知道指针、引用和迭代器是什么吗?您是否知道使迭代变为 std::set 无效或指向元素的指针或引用的规则?如果是的话,这就是我所说的。如果不是,请搜索并阅读该主题,然后返回。
    • 好的,现在我明白你的意思了(我认为),你是对的,move 允许像迭代器这样的东西迁移,但这只有在迭代器没有指向容器的指针时才有可能,否则 move 将不得不遍历迭代器。你说的是这个吗?
    • @martin move 允许指向集合中元素的指针、对集合中元素的引用以及集合中的迭代器现在在它们引用之前引用之前引用移动到集合中的元素-放。 Copy nkt 可能会这样做。这与性能或不可移动类型无关。并且是移动语义可以做的事情。移动语义不必这样做;查看向量,它在哪里变化(move-assign 不需要移动迭代器)
    • 我希望向量具有可变性,因为它将所有内容存储在一起,并且可能会调整大小并因此使迭代器无效。而地图(例如)不会重新分配未触及的项目。但我的观点是,如果我们谈论一个新容器,如果它有一个迭代器持有指向容器的指针,它不能在移动后保留它们,但指向元素的指针可以。这都是由于实际数据,因此迭代器指向的内容保持不变。而深拷贝会创建一组新元素,而 DTOR 会杀死旧元素,从而使迭代器无效。我说的对吗?
    【解决方案2】:

    这与您的观点有关,但我认为移动语义的另一个好处是作为在代码中记录所有权的一种方式。通过使用 move,您可以清楚地表明对象的所有权已从一个地方转移到另一个地方。这使得推理代码更容易。

    如果您正在尝试调试程序并了解对象的生命周期,那么只有一条路径可以更容易。如果所有权转移是作为副本实现的,您必须确保对象原始副本的生命周期也已结束。

    【讨论】:

      猜你喜欢
      • 2013-12-13
      • 2021-12-23
      • 2010-10-04
      • 2012-05-30
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2010-12-16
      相关资源
      最近更新 更多