C++ 左值右值以及std::move函数解释

左值和右值

左值,右值顾名思义就是在一个赋值语句左边或者右边的值,在C++语言中,二者是有区别的,左值是指表达式可以被取址的值,即表达式返回的是一个可以在内存中存储的位置;右值是指表达式返回的是临时值,没有确定的内存地址,不能被取址。
可以归纳为:

  • 当一个对象被用作右值的时候,用的是对象的值(内容)
  • 当对象被用作左值的时候,用的是对象的本身(在内存中的地址)

实例:

int x = 5;  // x 是一个左值,可以被取址
int array[5];  // array 是一个左值,可以被取址
int result = 3 + 4;  // 3 + 4 是一个右值,不可以被取址

左值引用和右值引用

  • 左值引用是指用于引用左值的引用类型。左值引用只能绑定到左值,不能绑定到右值。它使用 & 符号表示
  • 右值引用是指用于引用右值的引用类型。右值引用只能绑定到右值,不能绑定到左值。它使用 && 符号表示
int x = 5;
int& ref_x = x;  // ref_x 是对 x 的左值引用
int&& ref_rvalue = 3 + 4;  // ref_rvalue 是对 3 + 4 的右值引用

std::move

std::move 是 C++ 中的一个标准库函数,用于将一个左值转换为右值引用。相当于告诉编译器:我们有一个左值,但我们希望像一个右值一样处理它
函数原型为:

typename std::remove_reference<T>::type&& std::move(T&& arg)

注意!!!使用 std::move 之后,对象会被“掏空”,也就是说它是没有内容的。如果想继续使用,就需要重新赋值

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main() {
  string str = "hello";
  vector<string> vec;

  vec.push_back(str);
  cout << "After vec.push_back(str) str=" << str << endl;

  vec.push_back(move(str));
  cout << "After vec.push_back(move(str)) str=" << str << endl;

  str = "word";
  cout << "重新赋值后 str=" << str << endl;
  return 0;
}
After vec.push_back(str) str=hello
After vec.push_back(move(str)) str=
重新赋值后 str=word

为什么要使用 std::move ?

std::move 将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝所以可以提高利用效率,改善性能;
比如vector::push_back 等这类函数时,会对参数的对象进行复制,连数据也会复制.这就会造成对象内存的额外创建, 本来原意是想把参数push_back进去就行了,通过std::move,可以避免不必要的拷贝操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木白baineng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值