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

Anw*_*sha 0 c++ move c++11

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

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

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

AnT*_*AnT 6

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

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

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

换句话说,移动语义不会"消除复制".它通过利用序列的事实来优化复制

  1. 将"重"复制srcdst
  2. 摧毁"沉重" src

可以被更有效的序列等效地替换

  1. 移动"重" srcdst,使src"空"
  2. 摧毁"空" src