左值和右值的区别
左值有明确的内存空间,右值无明确的内存空间,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;
}