首页 > 编程语言 >c++ 对于传递引用和传递值的理解

c++ 对于传递引用和传递值的理解

时间:2024-11-11 20:42:13浏览次数:3  
标签:QWORD mov c++ rbp 传递 eax 引用 PTR rax

首先先上一段c++代码, 可以看出foo函数参数是引用类型,bar函数参数是值类型

typedef struct A{
    int x;
    int y;
} A;

void foo(A& a) {
r    a.x++;
}

void bar(A a) {
    a.x++;
}

int main() {
    A a = {1, 2};
    foo(a);
    bar(a);
    return 0;
}

在vscode中开启debug模式,然后在debug console页面查看三个函数的汇编代码

-exec disassemble foo
Dump of assembler code for function foo(A&):
   0x00005590410681a9 <+0>:	endbr64 
   0x00005590410681ad <+4>:	push   rbp
   0x00005590410681ae <+5>:	mov    rbp,rsp
   0x00005590410681b1 <+8>:	mov    QWORD PTR [rbp-0x8],rdi
   0x00005590410681b5 <+12>:	mov    rax,QWORD PTR [rbp-0x8]
=> 0x00005590410681b9 <+16>:	mov    eax,DWORD PTR [rax]
   0x00005590410681bb <+18>:	lea    edx,[rax+0x1]
   0x00005590410681be <+21>:	mov    rax,QWORD PTR [rbp-0x8]
   0x00005590410681c2 <+25>:	mov    DWORD PTR [rax],edx
   0x00005590410681c4 <+27>:	nop
   0x00005590410681c5 <+28>:	pop    rbp
   0x00005590410681c6 <+29>:	ret    
End of assembler dump.
-exec disassemble bar
Dump of assembler code for function bar(A):
   0x00005590410681c7 <+0>:	endbr64 
   0x00005590410681cb <+4>:	push   rbp
   0x00005590410681cc <+5>:	mov    rbp,rsp
   0x00005590410681cf <+8>:	mov    QWORD PTR [rbp-0x8],rdi
   0x00005590410681d3 <+12>:	mov    eax,DWORD PTR [rbp-0x8]
   0x00005590410681d6 <+15>:	add    eax,0x1
   0x00005590410681d9 <+18>:	mov    DWORD PTR [rbp-0x8],eax
   0x00005590410681dc <+21>:	nop
   0x00005590410681dd <+22>:	pop    rbp
   0x00005590410681de <+23>:	ret    
End of assembler dump.
-exec disassemble main
Dump of assembler code for function main():
   0x00005590410681df <+0>:	endbr64 
   0x00005590410681e3 <+4>:	push   rbp
   0x00005590410681e4 <+5>:	mov    rbp,rsp
   0x00005590410681e7 <+8>:	sub    rsp,0x10
   0x00005590410681eb <+12>:	mov    rax,QWORD PTR fs:0x28
   0x00005590410681f4 <+21>:	mov    QWORD PTR [rbp-0x8],rax
   0x00005590410681f8 <+25>:	xor    eax,eax
   0x00005590410681fa <+27>:	mov    DWORD PTR [rbp-0x10],0x1  //rbp-0x10 ~ rbp-0xc 存放的是0x1
   0x0000559041068201 <+34>:	mov    DWORD PTR [rbp-0xc],0x2   //rbp-0xc ~ rbp-0x8 这4个字节存放的是0x2
   0x0000559041068208 <+41>:	lea    rax,[rbp-0x10]    //rbp-10是一个内存地址, 把这个内存地址存放在rax寄存器中
   0x000055904106820c <+45>:	mov    rdi,rax           //rax寄存器内容移动到rdi中
   0x000055904106820f <+48>:	call   0x5590410681a9 <foo(A&)>  //call 指令会把下一条指令地址0x0000559041068214 push到栈顶
   0x0000559041068214 <+53>:	mov    eax,DWORD PTR [rbp-0x10]
   0x0000559041068217 <+56>:	mov    esi,eax
   0x0000559041068219 <+58>:	lea    rdi,[rip+0x2e20]        # 0x55904106b040 <_ZSt4cout@@GLIBCXX_3.4>
   0x0000559041068220 <+65>:	call   0x5590410680b0 <_ZNSolsEi@plt>
   0x0000559041068225 <+70>:	mov    rax,QWORD PTR [rbp-0x10] //这个是mov指令, 会把[rpb-0x10] 引用的内存里面的值传递给被调用函数
   0x0000559041068229 <+74>:	mov    rdi,rax  
   0x000055904106822c <+77>:	call   0x5590410681c7 <bar(A)>
   0x0000559041068231 <+82>:	mov    eax,DWORD PTR [rbp-0x10]
   0x0000559041068234 <+85>:	mov    esi,eax
   0x0000559041068236 <+87>:	lea    rdi,[rip+0x2e03]        # 0x55904106b040 <_ZSt4cout@@GLIBCXX_3.4>
   0x000055904106823d <+94>:	call   0x5590410680b0 <_ZNSolsEi@plt>
   0x0000559041068242 <+99>:	mov    eax,0x0
   0x0000559041068247 <+104>:	mov    rdx,QWORD PTR [rbp-0x8]
   0x000055904106824b <+108>:	xor    rdx,QWORD PTR fs:0x28
   0x0000559041068254 <+117>:	je     0x55904106825b <main()+124>
   0x0000559041068256 <+119>:	call   0x559041068090 <__stack_chk_fail@plt>
   0x000055904106825b <+124>:	leave  
   0x000055904106825c <+125>:	ret    
End of assembler dump.

标签:QWORD,mov,c++,rbp,传递,eax,引用,PTR,rax
From: https://www.cnblogs.com/jasonjunshu/p/18540544

相关文章

  • 关于右值引用测试
    不论在win:vs,gcc测试,使用RightValue,性能出现下降  在Llvm下,使用RightValue,性能也出现下降: 测试参考之前的博客代码,现有的代码也可以:#include<iostream>#include<vector>#include<utility>#include<chrono>usingnamespacestd;usingnamespacestd::chrono;......
  • 深入计算机语言之C++:STL之string的认识与使用
    ......
  • 【C++】踏上C++的学习之旅(七):深入“类和对象“世界,掌握编程的黄金法则(二)(内含构造函数
    文章目录前言1.类的6个默认的成员函数2.构造函数和析构函数的“好处”3.构造函数3.1概念3.2构造函数的特性4.析构函数4.1概念4.2特征前言在踏上C++的学习之旅(六):深入“类和对象“世界,掌握编程的黄金法则(一)中,我给大家讲解了"类"的定义以及如何使用类创建出......
  • 2024年华为OD机试真题-光伏场地建设规划 -C++-OD统一考试(E卷)
    最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客     每一题都含有详细的解题思路和代码注释,精编c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,发现新题及时跟新。题目描述祖国西北部有一片大片......
  • C++ 核心代码
    C++核心代码通常指一些基础、常用的代码片段,可以用于各种C++项目中,包括输入输出、基本数据结构、算法实现等。下面是一些典型的C++核心代码示例:1.基本输入输出cppinclude<iostream>usingnamespacestd;intmain(){inta,b;cout<<"Entertwonumbe......
  • 解决 VSCode 中 C/C++ 编码乱码问题的两种方法
    解决VSCode中C/C++编码乱码问题的两种方法在中国地区,Windows系统中的cmd和PowerShell默认编码是GBK,但VSCode默认使用UTF-8编码。这种编码不一致会导致在VSCode终端中运行C/C++程序时出现乱码。以下介绍两种方法来解决这一问题。方法一:通过CodeRunner......
  • C++数学
    前言C++算法与数据结构打开打包代码的方法兼述单元测试数论:质数、最大公约数、菲蜀定理组合数学汇总计算几何博弈论曼哈顿距离与切比雪夫距离红线是哈曼顿距离,绿线是切比雪夫距离。二维曼哈顿距离转切比雪夫距离曼哈顿距离:|x1-x2|+|y1-y2|。典型应用:某个棋子只能......
  • C++ 的“活动范围”:变量的作用域和生命周期,一次搞懂!
    在C++里,变量就像是临时开的小仓库,可以用来存放各种数据。可是,不是所有变量都可以随便在哪儿都被访问到。它们都有自己的活动范围,也就是只有在特定区域才能被找到和使用。这种活动范围叫做作用域。而生命周期则是指这些变量“活着”的时间段,等生命周期结束,变量就会被自动清......
  • C++ 数据结构详解
    目录C++数据结构详解引言1.数组(Array)示例代码2.向量(Vector)示例代码3.链表(List)示例代码4.栈(Stack)示例代码5.队列(Queue)示例代码6.集合(Set)示例代码7.映射(Map)示例代码C++数据结构详解引言数据结构是计算机科学中的一个重要概念......
  • 各个语言的标准输入输出(C++,Python,Go,MATLAB)
    标准输入和输出C/C++cin,cout,getline()进行输入输出#include<bits/stdc++.h>usingnamespacestd;intmain(){//输入`1231231` inta,b,c; cin>>a>>b>>c; cout<<a<<b<<c<<endl;//输出1231231并换行(endl代表换行) //输入`......