欢迎光临散文网 会员登陆 & 注册

C++右值引用

2022-04-16 11:42 作者:CSDN首席喷子  | 我要投稿

在C++中,值分为右值和左值。所谓右值就是赋值等号右边的值,左值就是左边的值。观察赋值过程Car car1 = Car{ },可以发现:

(1)左值有名字,右值没有名字。

(2)运行时首先分配右值的内存,然后分配左值内存,再把右值内存复制到左值。

因此,C++传参数时(如函数和容器调用)都会伴随着内存的复制,效率很低。反观其它语言(如C#),由于变量实际上是一个引用,右值和左值是同一个内存,没有复制。


C++ 11标准在语法层面上引入了右值引用,有效减少了浪费。在C++ 11之前,右值是不能非const引用的:

而右值引用则可以在非const情况下赋值:

此时内存上只有一个Car。注意,当赋值给car4以后,因为有了名字(car4),这块内存重新变成了一个左值。好在标准库中的std::move函数能够将左值转换为右值:

std::move函数的另一个功能是能够将右值引用转换为一个右值,这个过程会调用该类型的移动构造函数:

在func处,c被重新转换为一个右值赋给形式参数passin,此时调用移动构造函数。此时,就可以大胆地使用等号赋值基本类型,并使用std::move移动复合类型的内存了。


C++右值引用的评论 (共 条)

分享到微博请遵守国家法律