当前位置:   article > 正文

std::move含义和使用场景

std::move含义

左右值以及引用的介绍

左值可以取地址、位于等号左边;而右值没法取地址,位于等号右边。在C++中右值指的的临时值或常量,更准确的说法是保存在CPU寄存器中的值为右值,而保存在内存中的值为左值。


左值引用,标志是&,能指向左值,不能指向右值;右值引用,标志是&&,顾名思义,右值引用专门为右值而生,可以指向右值,不能指向左值。

std::move介绍

从move的实现看,实际上std::move就是一个类型转换器,将左值转换成右值。

  1. template <typename T>
  2. typename remove_reference<T>::type&& move(T&& t)
  3. {
  4. return static_cast<typename remove_reference<T>::type&&>(t);
  5. }

所以说std::move是一个非常有迷惑性的函数,它并不能把一个变量里的内容移动到另一个变量,事实上std::move移动不了什么,唯一的功能是把左值强制转化为右值,让右值引用可以指向左值。

所以,概括来说:

  • 从性能上讲,左右值引用没有区别,传参使用左右值引用都可以避免拷贝。
  • 右值引用可以直接指向右值,也可以通过std::move指向左值;而左值引用只能指向左值(const左值引用也能指向右值)。
  • 作为函数形参时,右值引用更灵活。虽然const左值引用也可以做到左右值都接受,但它无法修改,有一定局限性。

std::move使用场景

在实际场景中,右值引用和std::move被广泛用于在STL和自定义类中实现移动语义,避免拷贝,从而提升程序性能

1. 返回右值

  1. std::string createResource() {
  2. std::string tempSrc = "Very large string";
  3. // 其他操作
  4. return std::move(tempSrc);
  5. }

2. 移动语义

  1. class MyClass {
  2. public:
  3. // 移动构造函数
  4. MyClass (MyClass && other) noexcept : data(std::move(other.data)) {
  5. // 其他资源的转移操作
  6. }
  7. // 移动赋值运算符
  8. MyClass & operator=(MyClass && other) noexcept {
  9. if (this != &other) {
  10. data = std::move(other.data);
  11. // 其他资源的转移操作
  12. }
  13. return *this;
  14. }
  15. private:
  16. std::vector<int> data;
  17. };

3. 容器操作

  1. std::vector<std::string> sourceVec = {"apple", "pear", "watermelon"};
  2. // 将 sourceVec 的元素移动到 targetVec, 移动后sourceVec 不再拥有原有的元素
  3. std::vector<std::string> targetVec;
  4. for (auto&& element : sourceVec)
  5. {
  6. targetVec.push_back(std::move(element));
  7. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/640084
推荐阅读
相关标签
  

闽ICP备14008679号