zoukankan      html  css  js  c++  java
  • std::move()

    左值、左值引用、右值、右值引用

     

    1、左值和右值的概念

             左值是可以放在赋值号左边可以被赋值的值;左值必须要在内存中有实体;
             右值当在赋值号右边取出值赋给其他变量的值;右值可以在内存也可以在CPU寄存器。
             一个对象被用作右值时,使用的是它的内容(值),被当作左值时,使用的是它的地址

    2、引用

            引用是C++语法做的优化,引用的本质还是靠指针来实现的。引用相当于变量的别名。

            引用可以改变指针的指向,还可以改变指针所指向的值。

            引用的基本规则:

    1. 声明引用的时候必须初始化,且一旦绑定,不可把引用绑定到其他对象;即引用必须初始化,不能对引用重定义
    2. 对引用的一切操作,就相当于对原对象的操作。

    3、左值引用和右值引用

        3.1 左值引用
             左值引用的基本语法:type &引用名 = 左值表达式;

        3.2 右值引用

            右值引用的基本语法type &&引用名 = 右值表达式;

            右值引用在企业开发人员在代码优化方面会经常用到。

            右值引用的“&&”中间不可以有空格。

     
     
     
     

    c++11 std::move() 的使用

     

    std::move函数可以以非常简单的方式将左值引用转换为右值引用。(左值、左值引用、右值、右值引用 参见:http://www.cnblogs.com/SZxiaochun/p/8017475.html

    通过std::move,可以避免不必要的拷贝操作。

    std::move是为性能而生。

    std::move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝。

    如string类在赋值或者拷贝构造函数中会声明char数组来存放数据,然后把原string中的 char 数组被析构函数释放,如果a是一个临时变量,则上面的拷贝,析构就是多余的,完全可以把临时变量a中的数据直接 “转移” 到新的变量下面即可。

    #include <iostream>
    #include <vector>
    #include <string>
    using namespace std;
    
    void TestSTLObject()
    {
        std::string str = "Hello";
        std::vector<std::string> v;
        
        // push_back
        v.push_back(str);
        std::cout<<"After copy, str is : " << str <<endl;
        
        // move
        v.push_back(std::move(str));
        std::cout<<"After move , str is : "<< str <<endl;
        
        std::cout<<"The contents of the vector are: 
    "<< v[0] <<endl << v[1]<<endl;
        
      // use it again
        str = "henry";
        std::cout<<"After reuse , str is : "<< str <<endl;
        std::cout<<"The contents of the vector are: 
    "<< v[0] <<endl << v[1]<<endl;
    
        
    }
    
    int main()
    {
        TestSTLObject();
    
        return 0;
    }

    //============= the result  is :  ============

    After copy, str is : Hello
    After move , str is : 
    The contents of the vector are: 
    Hello
    Hello
    After reuse , str is : henry
    The contents of the vector are: 
    Hello
    Hello

    参考地址:https://www.cnblogs.com/szxiaochun/p/8017349.html

  • 相关阅读:
    Android学习路径(两)项目文件本身使用场景和文件演示
    A左右ndroid正在使用Uri监视数据库中的更改
    离PACKET_INp获取信息acket data
    curl 命令
    POJ 3177 Redundant Paths POJ 3352 Road Construction(双连接)
    Linux 下一个 Mysql error 2002 错误解决
    图片打水印 缩放 和一个输入流的转换
    qt Qt5开发
    qt 关于Qt中MVC的介绍与使用
    qt mvc3
  • 原文地址:https://www.cnblogs.com/music-liang/p/12886405.html
Copyright © 2011-2022 走看看