Chinaunix首页 | 论坛 | 博客
  • 博客访问: 163703
  • 博文数量: 19
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 722
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-12 14:11
个人简介

而立之年,一事无成。

文章分类

全部博文(19)

文章存档

2016年(1)

2014年(4)

2013年(14)

我的朋友

分类: C/C++

2016-08-24 15:43:29

move语义和右值引用:

先参考: http://www.cnblogs.com/tingshuo/archive/2013/01/21/2870035.html


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

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

多么精妙!

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

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

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

阅读(9826) | 评论(0) | 转发(0) |
0

上一篇:PC重启后github验证失败bug的对策

下一篇:没有了

给主人留下些什么吧!~~