zoukankan      html  css  js  c++  java
  • c++ 右值引用

    右值引用
    摘取自Seayoki的知乎 C++有多难
    c++中等号(=)代表拷贝,然而c++想赋予等号(=)不一样的功能,即转移资源的所属功能,这个功能通过右值引用实现

    int a;
    a = 3;
    int& h1 = a;
    int&& h2 = std::move(a);
    

    int a;会分配 32 bits 的空间。int& h1 = a; 就是左值引用,如果对 a 进行任何修改,都会应用到 h1。
    int&& h2 = std::move(a); 就是右值引用,如果对 a 进行任何修改,都会应用到 h2。从用法上看,似乎左值
    引用和右值引用看起来毫无区别。但是从编译器底层来看,int a 和 int& h1 占用两份内存,也就是 double 32 bits。
    而 int a 和 int&& h2 只占用一份内存,也就是32 bits。通过使用右值引用,我们可以节省出更多的空间给其他代码使用。
    右值引用一般要这么写

    int hello(){ return 1; }
    int &&h1 = 3;
    int &&h2 = hello();
    

    函数的返回值和字面值会被编译器自动当作右值处理,不用加std::move();

    int a{ 3 };
    int &&h1 = std::move(a);
    

    普通变量不会被当作右值处理,需要加std::move();// wrong !!!

    int&& hello() {...}
    // correct!
    int& hello() {...}
    

    注意,返回值类型不需要为右值,因为编译器会自动把返回值类型当作右值处理,所以最常见的返回值类型是普通类型或者引用类型。

    int hello() { return 1; }
    int&& h1 = hello();
    

    对于每个函数而言,一旦函数执行完毕,所有局部变量按顺序出栈,依次销毁。
    此时函数会返回一个右值,这个右值可以"移动"(not copy)到另一个变量身上。

  • 相关阅读:
    n9多媒体不显示图片处理方法
    STM32全球唯一ID读取方法
    VS2008+QT+CYAPI开发USB程序问题
    QT对话框中show和exec的区别
    华硕T20信号差的解决办法
    使用JTAG方式配置EPCS芯片时显示容量不够的解决方法
    QT中使用中文
    MODBUS CRC16
    递归的四条基本法则
    Java代码混淆和加密Jocky
  • 原文地址:https://www.cnblogs.com/fashow/p/15105262.html
Copyright © 2011-2022 走看看