(一)C++11中std:move()的作用和用法
功能:返回传入参数的右值引用。右值引用的概念是在C++11才提出来的。在此之前只有一种引用。
优点:调用此函数不会引起任何数据争用。
通常,右值是其地址无法通过解引用获得的值,因为它们是文字或本质上是临时的(例如,函数或显式构造函数返回的值)。通过将对象传递给此函数,可以获得引用该对象的右值。
标准库的许多组件都实现了移动语义,允许直接转移对象的资产和属性的所有权,而在参数为右值时无需复制它们。
要注意-在标准库中-移动意味着从中移出的对象处于有效但未指定的状态。这意味着在执行此操作后,仅应销毁移出对象的值或为其分配新值;否则访问它会产生未指定的值。
(二)
那么std::move是如何避免内存拷贝的呢?看它的实现发现,std::move只是进行了左右值的转换,也就是类型的转换,并没有改变对象本身。
这里涉及到左值和右值的概念:
左值:简单理解为赋值运算符左边的变量,可以接受右边值,例如 int a = 10; a就是一个左值
右值:赋值运算符右边的值,这个值可以是一个变量页可以是一个常量,例如 int a = 10; 10就是一个右值,并且是个常量。
了解了左值和右值的区别,那么std::move将一个左值转换成右值,为什么就可以避免内存拷贝?实际上这里的避免内存拷贝依赖于被std::move转换的对象的具体实现,std::move只是将对象以右值的形式告诉接受者,这个对象的赋值操作可以直接使用其内存地址,而不是创建新内存拷贝数据。
如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!
添加我为好友,拉您入交流群!
请使用微信扫一扫!