传参右值应用的好处

左值和右值的区别

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

相关推荐

  1. 应用好处

    2024-05-09 07:52:04       35 阅读
  2. 语言中 函数用地址好处

    2024-05-09 07:52:04       35 阅读
  3. axios方式

    2024-05-09 07:52:04       57 阅读
  4. C# 方法

    2024-05-09 07:52:04       39 阅读
  5. c++ 如何理解

    2024-05-09 07:52:04       41 阅读
  6. Vue路由

    2024-05-09 07:52:04       51 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-09 07:52:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-09 07:52:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-09 07:52:04       87 阅读
  4. Python语言-面向对象

    2024-05-09 07:52:04       96 阅读

热门阅读

  1. 用最简单的示例去理解:Dijkstra最短路径算法

    2024-05-09 07:52:04       30 阅读
  2. Spring Boot应用部署 - Tomcat容器替换为Undertow容器

    2024-05-09 07:52:04       31 阅读
  3. spring boot 核心配置文件是什么?

    2024-05-09 07:52:04       37 阅读
  4. Wireshark Lua插件开发实战:应对TCP粘包问题

    2024-05-09 07:52:04       34 阅读
  5. Linux-笔记 常用命令

    2024-05-09 07:52:04       32 阅读
  6. 数字孪生与虚拟现实结合

    2024-05-09 07:52:04       33 阅读
  7. 基于python+Django的二维码生成算法设计与实现

    2024-05-09 07:52:04       34 阅读
  8. NPM和GitLab

    2024-05-09 07:52:04       36 阅读
  9. 学习Uni-app开发小程序Day5

    2024-05-09 07:52:04       36 阅读