学习 c++11 之 右值引用

作者: | 更新日期:

这个功能可以大大提高代码的性能。

本文首发于公众号:天空的代码世界,微信号:tiankonguse

零、背景

之前提到,我们开始从 c98 切换到 c++11 了。

所以我打算分一个系列来介绍常见的 c++11 的语法。

今天要分享的第四个知识点非常有用,那就是右值引用 。

一、旧的方式

以前,为了性能,我们会使用swap来提高避免大量copy

void set(string& a){
    string b;
    b.swap(a);
    a.clear();
    //process b
}

但是有时候,传入的参数是右值,必须加const,不然编译不通过。

set("hello");  //error non-const reference ...

此时能做的只能是加上const,然后进行copy操作。

void set(const string& a){
    string b = a;
    //process b
}
set("hello");

而这样会导致大量的copy操作,从而导致性能低下。

三、新的方式

常见的右值有数字和字符串常量,以及所有的临时变量,隐式的类型转换也属于临时变量。

面对右值只使用一次的copy问题,c++11 支持了一种叫做右值引用的新语法。

语法:右值引用通过两个引号来表示,如int&& rvalue_ref

通过右值引用,我们就可以修改右值的值了,也就是可以对右值进行swap操作了。

比如上图这段代码,main函数里面,第一个f(a)会调用左值引用的那个函数,也就是第一个函数。
而第二个f(A("99"))则会调用右值引用那个函数,也就是第二个函数。
而第三个f(std::move(a))则更高端,相当于告诉编译器a这个变量可以按临时变量进行优化处理。

对于 A 这个类,我也在构造函数和赋值函数中加了对应的辅助信息。

运行后,可以发现一个神奇的事情。

右值引用 i 的值不见了。

这就是右值引用神奇的地方,我们通过狸猫换太子的手法,把临时变量里面的值变没了。
而且这个过程速度很快,不怎么消耗性能。

四、最后

右值引用这个功能非常好。

有了这个语法,我们就可以使用简单的代码来提高服务的性能了,而不像之前那样各种swap

你是用过右值引用和std::move语法吗?有什么感想?

-EOF-

本文公众号:天空的代码世界
个人微信号:tiankonguse
公众号ID:tiankonguse-code

本文首发于公众号:天空的代码世界,微信号:tiankonguse
如果你想留言,可以在微信里面关注公众号进行留言。

关注公众号,接收最新消息

tiankonguse +
穿越