传参右值引用的好处

左值和右值的区别

左值有明确的内存空间,右值无明确的内存空间,230+300是没有正式的地址的,一般是临时找一个寄存器暂存,不放栈中

右值不代表在右边,左值不代表在左边

#include<iostream>
using namespace std;
void Add(int a) {
	cout << a <<endl;
}
int main() {
	Add(230 + 300);
	return 0;
}

反汇编代码

	Add(230 + 300);
01331E91  push        212h  //这是找了一个栈空间
01331E96  call        Add (0133157Dh)  
01331E9B  add         esp,4

这中间相当于创建了一个临时变量放栈里面int temp = 230+300;Add(temp);

传递右值引用代码

#include<iostream>
using namespace std;
void Add(int&& a) {
	cout << a <<endl;
}
int main() {
	Add(230 + 300);
	return 0;
}

反汇编代码

	Add(230 + 300);
01171E95  mov         dword ptr [ebp-0C8h],212h  
01171E9F  lea         eax,[ebp-0C8h]  
01171EA5  push        eax  
01171EA6  call        Add (01171587h)  
01171EAB  add         esp,4 

这是将230+300的值临时放在eax寄存器中

目前这个地方还是一知半解,需要深入学习汇编知识

右值引用在结构体中的妙用

#include<iostream>
using namespace std;
struct Role {
	int hp;
	int mp;
};
Role create(int hp,int mp) {
	Role rt{ hp,mp };
	return rt;
}
void show(Role rl) {
	cout << rl.hp << " " << rl.mp << endl;
}
int main() {
	show(create(100, 300));
	return 0;
}

有时候需要临时变量来测试,这种返回结构体的行为太浪费栈空间了

于是可以采用右值引用来节省栈空间

void show(Role&& rl) {
	cout << rl.hp << " " << rl.mp << endl;
}

本质就是说右值引用可以不用占用宝贵的栈空间,而是自己找一些犄角旮旯存(一些寄存器)

和常量左值引用不同的是,右值引用还可以对右值进行修改。例如:

#include<iostream>
using namespace std;

int main() {
 	int&& e = 320 + 230;
 	e = 1500;
	cout << e << endl;
	return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值