zoukankan      html  css  js  c++  java
  • C++11特性-右值引用

    什么是左值,什么是右值

    常见的误区有 = 左边的是左值,右边的是右值。

    左值:具有存储性质的对象,即lvalue对象,是指要实际占用内存空间、有内存地址的那些实体对象,例如:变量(variables)、函数、函数指针等。

    右值:相比较于lvalue就是所谓的没有存储性质的对象, 也就是临时对象。

    在c++中,临时对象不能作为左值,但可以作为常量引用const & 

     ++i = 3;  // ok
      i++ = 3;  // error C2106: “=”: 左操作数必须为左值

    ++i:i先自增1,++i之后还是指向i的对象 
    i++:先把i自增之后的值丢给一个临时变量,i++之后指向的是那个临时变量。如果放在单条语句中,这两个没啥区别。

    int i = 0;  // 在这条语句中,i 是左值,0 是临时值,就是右值。
    在C++11之前,右值是不能被引用的,如:
    int &a = 1;   // error C2440: “初始化”: 无法从“int”转换为“int &”
    
    const int &a = 1;//我们最多只能用常量引用来绑定一个右值,如:
    int &&a = 1;//在C++11中,我们可以引用右值,使用&&来实现:

    常量引用可以绑定一个右值,但缺点是这个值不能改变。

    右值引用&&

    c++中临时对象可能会大量存在,比如string/STL调用中。临时对象中的资源(buffer或者字符串)会随着临时对象的析构而消失,所以一般会在对象析构前把它们(资源)拷贝出来,而不会直接引用这些资源,否则会野指针。

    其实,既然已经是临时对象了,马上就会被析构掉,所以赶在析构前改一下里面的内容也不会带来太多负面影响,当然是在控制良好的前提下。基于这个思路,我们可以放心大胆的直接引用临时对象中的资源指针(比如指针赋值,引用该资源),然后把它置空(防止被临时对象释放掉),或者更屌一点的,把我们意图释放的指针,直接赋值给临时对象的该指针,借助临时对象在析构时会释放它的资源的时机,把我们想释放的东西给释放掉!

    多么精妙!

    在c11之前,临时对象只能以 const MyClass& my_object 这种方式传递,有const在,所以临时对象是不能被修改的。但是c11引入了右值引用 MyClass&&,导致我们可以修改临时变量了!

    假如你是函数的提供者,你提供了带右值引用的参数,那么,你就大胆的去引用它的资源,修改它的资源吧,不用担心它还会被使用到,当函数返回之后。因为它是右值引用,该函数的调用者会保证这个参数不会再被使用到。

    假如你是函数的调用者,当你发现你有一个左值对象my_object即将不再被使用到了,就可以用move语义把它转成右值引用丢给函数,任函数去修改它的内容无所谓,因为你确定它不再被使用了(如果你确定不了,那就不能使用move语义)。当然,假如你处理的已经是右值了(比如函数返回值),那就跟以前没什么两样。

     

    右值引用的意义何在

    • 右值引用是用来支持转移语义的。
    • 转移语义可以将资源 (堆,系统对象等)从一个对象转移到另一个对象,这样能够减少不必要的临时对象的创建、拷贝以及销毁,能够大幅度提高 C++ 应用程序的性能。
    • 临时对象的维护 ( 创建和销毁 ) 对性能有严重影响。
    • 转移语义是和拷贝语义相对的,可以类比文件的剪切与拷贝

    有了右值引用和转移语义,我们在设计和实现类时,对于需要动态申请大量资源的类,应该设计转移构造函数和转移赋值函数,以提高应用程序的效率。 

    (1)参数(右值)的符号必须是右值引用符号,即“&&”。

    (2)参数(右值)不可以是常量,因为我们需要修改右值。

    (3)参数(右值)的资源链接和标记必须修改。否则,右值的析构函数就会释放资源。转移到新对象的资源也就无效了。

    先记录这么多,等以后有机会再深入总结。

  • 相关阅读:
    20145320 《信息安全系统设计基础》第2周学习总结
    20145320 《信息安全系统设计基础》第一周学习总结
    20145320 周岐浩《信息安全系统设计基础》第0周学习总结
    暑假CTF训练一
    #20145320课程总结
    20145320 《Java程序设计》第10周学习总结
    20145320《Java程序设计》第五次实验报告
    20145320《Java程序设计》第9周学习总结
    20145320《Java程序设计》第四次实验报告
    20145320《Java程序设计》第三次实验报告
  • 原文地址:https://www.cnblogs.com/mini-coconut/p/9543533.html
Copyright © 2011-2022 走看看