在阅读有关std :: move语义和rvalue引用的一些文章时,我发现它们是因为复制数据是一项昂贵的工作而引入的.真的!复制很昂贵,但这与我们在C++中使用"REFERENCES"的原因不同.它们也只是帮助传递变量的地址并防止昂贵的复制过程.
那么为什么要引入std :: move和rvalue呢?我的意思是什么工作不能正常引用做前者可以做的?
我的问题主要涉及功能.我的意思是当你将一个变量传递给一个函数时,哪个更好?为什么?: - 1.通过左值参考2.使用移动通过右值参考
移动语义适用于必须复制数据的情况,即无法解决问题的情况.数据必须"出现"在新对象中的新位置.即按设计,绝对必须进行数据的物理重新定位/重新创建.普通参考文献不以任何方式涵盖此内容.例如,当您向元素提供的值添加元素时,您也必须以某种方式出现在新向量元素中.std::vector
在经典C++中,大部分时间都是通过无条件地将数据复制到新位置来实现的.然而,很明显,在某些情况下,我们并不真正关心原始对象的命运,从中复制数据 - 原始对象在复制后立即被销毁.当然,它提供了一个相当明显和巨大的优化机会:由于我们不关心原始对象,我们可以简单地"窃取"(移动)数据,将数据放入新位置然后销毁(现在为空) ) 原版的.这样可以更加有效地"克隆"(复制)数据并破坏原始数据.
我们曾经在经典C++中利用这种优化机会.但我们不得不手动完成,没有核心语言的支持.移动语义和右值引用是这种支持被引入核心语言的方式,这为编译器本身打开了这个优化机会.
换句话说,移动语义不会"消除复制".它通过利用序列的事实来优化复制
src到dstsrc可以被更有效的序列等效地替换
src做dst,使src"空"src| 归档时间: |
|
| 查看次数: |
127 次 |
| 最近记录: |