c++11的使用心得(二)---右值引用

在C++11中,可能有人在看到别人写代码的时候会有这样的函数声明:

template<tyoename FuncType>;
void RigisterFunc(FuncType&& func);

看到这行代码,如果之前没有用过C++11的人,瞬间可能会感觉到一愣,这个&&符号是什么意思?这肯定不是逻辑与的运算,在上网查了之后知道了这个叫做右值引用运算符,是C++11开始引入的机制。但或许很多人在编码的过程中凭借着习惯和经验,随手就写下了代码,对左值右值这种基本的概念已经没有意识或者概念。那我们就先来回顾一下这两个概念:

左值:指表达式结束后依然存在的持久性对象,可以出现在赋值运算符的左侧或者右侧的表达式,可以进行取地址操作,即,在表达式之前加&符号。

右值:指表达式结束后不复存在的临时对象,只能出现在赋值运算符右侧的表达式,不能进行取地址操作。如下:

int a = 1;     //a 是左值
int b = a;     //a b 均是左值
a = b;         //a b 均是左值
int* p = &a;   //对左值进行取地址操作

a = a*b;       //a 是左值,a*b 是右值
a*b = a;       //错误的表达式,a*b只能是右值,不能进行直接复制
2 = b;         //错误的表达式,数字只能是右值,不能进行直接复制
int* p1 = &2;  //错误的表达式,不能直接对右值进行取地址操作

从上述的概念和例子中可以看到的左值和右值是两种不同的东西。但在真正的编码过程中,这两个概念都是通过经验区分,很少有人会直接关注这个是左值还是右值。因此当提到右值引用的时候,有一些人直接傻眼了,右值是个什么鬼东西,右值引用又是什么鬼东西,右值引用的作用是什么?

在以上的概念说明中,针对右值已经做了简单的说明。那么右值引用就简单的理解为是右值的引用,同左值引用一样。右值引用的作用则是为了实现移动语义。在C++中一直存在一个性能争议,即C++只有单个返回值,如果要返回多个返回值,比较复杂。常用的有两种方式:

1、在函数的定义中,传入多个参数的引用,从而在完成操作后修改引用的值,达到返回多个结果的效果。这种接口设计在接口扩展中相对复杂,不仅要在接口上添加参数,还需要修改调用函数的各处,工作量繁重,并且如果接口参数较多的时候,函数声明本身会变成一个累赘。

2、定义结构体或者类进行封装,这样在将来的使用中,修改接口只需要在返回的类或者结构中进行修改,增删成员,并修改实现函数即可。但由于在返回的过程中会产生临时对象,会进行额外的消耗,引发性能问题(但目前由于计算机性能较高,因此在非特殊的情况下,该性能损耗是可以承受的,该使用方案由于第一种方案)

但如果大量的使用临时对象,则会引发大量的性能损耗。虽然机器性能较高,但如果多处存在或大量存在临时对象的返回拷贝,则性能也会损耗过大。为了解决此类的临时对象拷贝,C++11中就加入了右值引用,为了解决移动语义,从而避免过多的拷贝构造引发的性能损耗。比如STL中的move就是使用了右值引用。

关于右值引用更多的知识,推荐两个地址:

http://www.cnblogs.com/hujian/archive/2012/02/13/2348621.html

http://thbecker.net/articles/rvalue_references/section_01.html



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值