深入浅出C++左值引用,右值引用,移动语义。

本文介绍了C++中的左值和右值的概念,以及左值引用和右值引用的区别。通过汇编层面的解析,展示了它们在内存中的表现。文章还探讨了右值引用如何通过std::move实现移动语义,特别是在vector::push_back中的性能提升,并强调了std::move仅进行类型转换,不改变性能。最后,讨论了移动语义在类设计中的重要性,特别是对于move-only类型的对象如unique_ptr。
摘要由CSDN通过智能技术生成

什么是左值 右值?

简单来说左值就是可以取地址,在=左边的,而右值就是不可以取地址,在=右边的。

int t=10;
  • t可以通过&取地址在=左边 所以t是左值
  • 10不可以取地址 在=右边10是右值。
class A{
	A(int a){
		a=10;
	}
	int a;
}

A a= A();

a可以通过&取地址,在等号左边可以a是左值。
A()不可以通过&取地址,在等号右边所以A()是右值。

什么是左值引用?什么是右值引用?

引用就是别名,同一变量的不同名字。通过引用传递参数可以避免拷贝,加快过程间执行速度。

左值引用

左值引用能指向左值不能指向右值。

int a=1;
int &b=a;//  左值引用指向左值,可以通过编译
int &b=1;// 左值引用指向右值,不可以通过编译

右值没有地址,没法被修改,所以左值引用无法指向右值。

注意: const 左值引用可以指向右值:

const int &x=5;//编译可以通过

加上const之后 不可以通过x修改指向的值,所以可以指向右值。这也是为什么使用const &作为函数参数的原因之一。如std::vector的push_back:

void push_back(const T &val);//如果没有const  push_back(1)这样就不能通过编译了。
右值引用

右值引用标志是&& ,右值引用可以指向右值不能指向左值。

int &&test=1;//ok
int a=1;
int &&test=a;//编译错误,指向了右值
test=3;//可以修改右值
汇编层面的左值引用与右值引用
int a(){
   int a=2;
   int &&b=1;
}

右值引用 x86汇编

		push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], 2 //  1
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值