首页 > 编程语言 >汇编角度看值传递类对象

汇编角度看值传递类对象

时间:2024-11-13 09:29:27浏览次数:1  
标签:汇编 lea mov rbp 传递 角度看 foo rax

首先奉上源代码

class A{
private:
    int i;
public:
    A() {
        std::cout << "default constructor is called" << std::endl;
        i = 0;
    }

    A(int _i): i(_i) {}
    
    A(const A& obj) {
        std::cout << "copy constructor is called" << std::endl;
        i = obj.i;
    }

    A& operator = (const A& obj) {
        std::cout << "assignment constructor is called" << std::endl;
        i = obj.i;
        return *this;
    }

    A (const std::initializer_list<int>& l) {
        std::cout << "initializer_list constructor is called" << std::endl;
        i = *(l.begin());
    }

    int get()const  {
        return i;
    }

    void set(int j) {
        i = j;
    }
};

void foo(A a){
    a.set(0xFF);
 }

int main() {
    A a(3);
    foo(a);
    return 0;

}

对于main函数中foo(a)这个函数调用,生成的汇编如下:

45	    foo(a);
   0x00005562b9bc5219 <+44>:	lea    rdx,[rbp-0x10]
   0x00005562b9bc521d <+48>:	lea    rax,[rbp-0xc]
   0x00005562b9bc5221 <+52>:	mov    rsi,rdx
   0x00005562b9bc5224 <+55>:	mov    rdi,rax
   0x00005562b9bc5227 <+58>:	call   0x5562b9bc52d6 <A::A(A const&)>
   0x00005562b9bc522c <+63>:	lea    rax,[rbp-0xc]
   0x00005562b9bc5230 <+67>:	mov    rdi,rax
   0x00005562b9bc5233 <+70>:	call   0x5562b9bc51c9 <foo(A)>

从以上汇编可以明显看到,如果foo()的形参是一个值类型的话,首先调用copy构造函数生成一个实参对象的副本,然后把这个副本的地址传递给函数调用,记住,是副本的地址!

标签:汇编,lea,mov,rbp,传递,角度看,foo,rax
From: https://www.cnblogs.com/jasonjunshu/p/18543147

相关文章

  • lec 02 arm汇编语言基础
    Lecture02:ARM汇编基础Contents为什么学习ARM/ISA汇编从C到汇编理解arm汇编理解机器执行1为什么学习汇编和指令集架构?1.令人困惑的应用表现2.指令集架构ISA(InstructionSetArchitecture)CPU向软件(应用程序和操作系统)提供的接口。理解软件在CPU上的运行(OS设......
  • C++ 中环境变量获取,动态库环境变量的传递
    C++中环境变量获取,动态库环境变量的传递在实践中,考虑最好还是使用getenv()函数来取得相关的环境变量.C/C++获取系统环境变量,其实是很简单的.函数名:getenv功能:从环境中取字符串,获取环境变量的值头文件:stdlib.h用法:char*getenv(char*envvar);getenv()用来取......
  • 【JAVA基础】JAVA中是值传递还是引用传递?
    JAVA中是值传递还是引用传递?基本数据类型的值传递引用类型的值传递在Java中,参数传递实际上是通过值传递(pass-by-value)来实现的,但这一点在理解时可能会因为对象的存在而显得有些复杂。为了详细解释这一点,我们需要区分基本数据类型(如int,char,boolean等)和引用类型(如......
  • c++ 对于传递引用和传递值的理解
    首先先上一段c++代码,可以看出foo函数参数是引用类型,bar函数参数是值类型typedefstructA{intx;inty;}A;voidfoo(A&a){ra.x++;}voidbar(Aa){a.x++;}intmain(){Aa={1,2};foo(a);bar(a);return0;}在vscode......
  • unity项目托管代码和非托管代码之间的数据传递原理刨析
    Unity3D架构Unity3D是一个广泛使用的游戏引擎,支持多种平台的游戏开发。它的架构主要由两部分组成:非托管代码(UnmanagedCode):这部分主要是用C++编写的,负责引擎的底层功能,如图形渲染、物理计算、音频处理等。非托管代码直接与操作系统和硬件交互,通常具有更高的性能,但开......
  • 反汇编命令学习以及分析越界和空指针问题
    1,反汇编命令行(1)move语法格式:movdestination,source例如:moveax,0x1;将立即数1复制到eax寄存器。立即数到寄存器mov[ebx],eax;将eax寄存器的值复制到ebx寄存器指向的内存地址,寄存器到内存moveax,ebx ;将ebx寄存器的值复制到eax,寄存器到寄存器moveax,[ebp-4]......
  • 入门龙芯旧世界汇编指令
    我借到了一台宝贵的龙芯3A6000设备,我期望在这台设备上面学习龙芯汇编指令。这台设备上的是龙芯旧世界的麒麟系统,由于这台设备很宝贵,我不能随意玩。为了防止弄坏设备,我将在此设备上面搭建docker环境,进入到docker容器里面进行开发在此设备上搭建docker环境的方法,详细请看......
  • @pytest.mark.parametrize()测试用例参数传递
    列表传参list1=[1,2,3]@pytest.mark.parametrize('data',list1)deftest_ddt1(data):print(data)元组传参tup1=(1,2,3)@pytest.mark.parametrize('data',tup1)deftest_ddt1(data):print(data)列表嵌套datas1=[('tom',......
  • 分布式事物传递 NetMQ测试
    usingNetMQ;usingNetMQ.Sockets;usingSystem;usingSystem.Threading;namespace消息传递库_NetMQ服务端{internalclassProgram{publicstaticvoidMain(){using(varpublisher=newPublisherSocket()){......
  • golang 参数传递问题
    golang的参数传递packagemainimport"fmt"/*值传递:函数收到的是参数的副本,修改不影响原本引用传递:函数收到的是参数的地址,修改会影响原本go中的值传递有:基本的数据类型,数组引用传递:切片以及指针*/funcchange(nums[3]int){ nums[0]=1}funcchange1(nu......