C ++移动语义(和rvalue引用)与普通引用

时间:2015-06-22 17:55:10

标签: c++ c++11 move

在阅读有关std :: move语义和rvalue引用的一些文章时,我发现它们是因为复制数据是一项昂贵的工作而引入的。真的!复制是昂贵的,但不是我们有"参考"在C ++中。它们也只是帮助传递变量的地址,并防止昂贵的复制过程。

那为什么要引入std :: move和rvalue呢?我的意思是什么工作不能正常引用做前者可以做的事情?

我的问题主要延伸到功能。我的意思是当你将一个变量传递给一个函数时,这是一个更好的&为什么? : - 1.通过左值参考 2.使用移动

通过右值参考

1 个答案:

答案 0 :(得分:6)

移动语义适用于 复制数据的情况,即无法绕过它时的情况。数据必须“显示”在对象中的位置。即,按照设计,绝对必须进行数据的物理重新定位/重新创建。普通参考文献不以任何方式涵盖此内容。例如,当您向std::vector添加元素时,您提供的元素值也必须以某种方式出现在新向量元素中。

在经典C ++中,大部分时间都是通过无条件数据复制到新位置来实现的。然而,很明显,在某些情况下,我们并不真正关心原始对象的命运,从中复制数据 - 原始对象在复制后立即被销毁。当然,它提供了一个相当明显和巨大的优化机会:由于我们不关心原始对象,我们可以简单地“窃取”(移动)数据,将数据放入新位置然后销毁(现在为空)原件。通过精心“克隆”(复制)数据并销毁原始文件,效率显着提高。

我们过去常常利用这种优化机会,即使在经典的C ++中也是如此。但我们不得不手动完成,没有核心语言的支持。移动语义和右值引用是这种支持被引入核心语言的方式,这为编译器本身打开了这个优化机会。

换句话说,移动语义不会“消除复制”。它通过利用序列

的事实来优化复制
  1. 将“重”src复制到dst
  2. 摧毁“沉重的”src
  3. 可以等效地用更有效的序列替换

    1. 移动“沉重”src执行dst,使src“空”
    2. 销毁“空”src