移动语义有两个以上的好处吗?

时间:2016-11-26 23:00:19

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

我试图更全面地了解何时实施移动语义,并且我相信它与所带来的好处交织在一起。

到目前为止,我已经知道了两个。

  1. 在移动对象时保存两个可能很昂贵的操作(当知道源很快消失而不使用时复制),没有移动完整副本并且已经执行了完整的析构函数,移动将保存原子原子引用计数对象的增量和减量,由指针保存的位图或其他数据结构的深拷贝,或文件句柄的复制,其中一个将被关闭,或任何其他一对"复制"和"破坏"

  2. 实现无法复制的对象(如复制的那样),但可以移动,确保只有一个对象具有相同的内容,但对象可以被移动关闭功能。例如。 unique_ptr,或任何无法或不需要复制的对象,但需要在一个地方创建,但在其他地方使用。

  3. 两者之间的区别在于第一个涉及性能,第二个涉及防止语义复制。

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

2 个答案:

答案 0 :(得分:2)

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

只要你有任何参考资料,这也可以解决,就像复杂对象的“内部”一样。 move逻辑上可以使该参考旅行,而copy可能不会。

答案 1 :(得分:1)

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

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