• 右值引用和std::move函数(c++11)


    1.对象移动

    1)C++11新标准中的一个最主要的特性就是移动而非拷贝对象的能力

    2)优势:

    • 在某些情况下,从旧内存拷贝到新内存是不必要的,此时对对象进行移动而非拷贝可以提升性能
    • 有些类如IO类或unique_ptr类包含不能被共享的资源,它们不能被拷贝但是可以移动

    3)移动操作“窃取”资源,并不分配任何内存

    2.右值引用

    1)C++11引入右值引有来支持移动操作,绑定到右值的引用称为右值引用,使用&&来绑定。

    1 int& left=42;                 //错误,左值引用必须绑定到左值上
    2 int n=42;
    3 int& left=n;                  //正确
    4 const int& left=42;           //正确,左值引用的一种特殊情况,可以将const的左值引用绑定到右值上
    5 
    6 int&& right=42;               //正确,右值引用必须绑定到右值上
    7 int&& right=n+42;             //正确,右值引用绑定到临时对象上

    2)左值持久,右值短暂:左值有持久的状态,而右值要么是字面常量,要么是在表达式求值过程中创建的临时变量。右值引用指向将要被销毁的对象

    3.move函数

    1)std::move用来获得绑定到左值的右值引用,头文件<utility>,一般不省略std::(避免名字冲突)

    int&& right=std::move(n);       

    2)调用move就意味着对编译器承诺:除了对源左值赋值和销毁之外,我们不对它进行其他任何操作

    int main()
    {
        int n = 5;
        int&& right = std::move(n);
        cout << right << endl;        //输出:5
        cout << n << endl;            //输出:5
    
        int num = std::move(n);    //将得到的右值引用赋给一个左值,对于内置类型,源左值依然有效
        cout << num << endl;        //输出:5
        cout << n << endl;        //输出:5
    
        string temp = "hehe";
        string&& rig = std::move(temp);
        cout << rig << endl;    //输出:hehe
        cout << temp << endl;    //输出:hehe
    
        string str = std::move(temp);    //将得到的右值引用赋给一个左值,对于类类型,源左值被清空
        cout << str << endl;    //输出:hehe
        cout << temp << endl;    //输出:空
    
        return 0;
    }

    运行结果:

  • 相关阅读:
    20145310《信息安全系统设计基础》第二周学习总结
    20145310《信息安全系统设计基础》第一周学习总结
    20145310 第0周《信息安全系统设计基础》学习总结
    课程总结
    20145310《Java程序设计》第5次实验报告
    20145310 《Java程序设计》第10周学习总结
    20145310 《Java程序设计》第9周学习总结
    20145310《Java程序设计》第4次实验报告
    20145310《Java程序设计》第3次实验报告
    git的安装以及遇到的问题
  • 原文地址:https://www.cnblogs.com/Joezzz/p/9706636.html
Copyright © 2020-2023  润新知