zoukankan      html  css  js  c++  java
  • 关于C++值传递与引用传递的汇编层面分析

    #include <iostream>
    using namespace std;
    void f1(int a, int b){
    	int c = a;
    	int d = b;
    	a = 1;
    	b = 1;
    }
    void f2(int& a, int& b){
    	int c = a;
    	a = 2;
    	b = 2;
    }
    
    int main(){
    	int a, b;
    	a = 3; b = 3;
    	f1(a, b);
    	f2(a, b);
    	return 0;
    }
    

    关键汇编代码 VS2013下调试

    值传递:
    int c = a;
        mov         eax,dword ptr [a]  %申请一个指针指向与a相同类型的变量,
        						   %上层内存空间存放的是a的副本,和一级指针联系
        mov         dword ptr [c],eax  
    int d = b;
        mov         eax,dword ptr [b]  
        mov         dword ptr [d],eax 
    a = 1;
        mov         dword ptr [a],1   % 这里的a其实是其副本
                  				  	 %即上层内存空间存放的a的副本
    b = 1;
        mov         dword ptr [b],1 
    /////////////////////////////////////
    引用传递:
    int c = a;
        move         eax,dword ptr[a]  % 申请一个指针指向实体a变量的地址,
        						%上层内存空间存放的是a的地址的副本  ,和二级指针联系    
        move         ecx,dword ptr[eax]
        move         dword ptr[c],ecx
    a = 2;
        mov         eax,dword ptr [a]  % eax 存放指向a的地址,
        						%即新申请的内存空间存放a的地址
        mov         dword ptr [eax],2  % 再进行合理的赋值
    b = 2;
        mov         eax,dword ptr [b]  
        mov         dword ptr [eax],2  
    
    值传递处调用
    mov         eax,dword ptr [b]  %这里直接取值
    push        eax  
    mov         ecx,dword ptr [a]  
    push        ecx  
    call        f1 (03913E3h)  
    add         esp,8  
    /////////////////////////////////
    引用传递处调用
    lea         eax,[b]     %这里取的是其地址
    push        eax  
    lea         ecx,[a]  
    push        ecx  
    call        f2 (039134Dh)  
    add         esp,8  
    
    额外添加,代码中没有体现
    ////////////////////////////////////////    
    指针取地址调用:
    0133816E  lea         eax,[c]  
    01338171  push        eax  
    01338172  lea         ecx,[b]  
    01338175  push        ecx  
    01338176  lea         edx,[a]  
    01338179  push        edx  
    0133817A  call        f2 (01331438h)  
    
  • 相关阅读:
    windows+vs2017+C语言 引入mysql.h对MYSQL数据库的操作
    开发依赖和运行依赖
    vue-cli 如何修改或删除预设preset记录
    git stash 缓存本地修改 简介
    DWZ 框架详解
    vue 脚手架(二,项目依赖说明 package.json)
    vue 脚手架(一,创建脚手架)
    JavaScript Number() Vs new Number()
    Flex 布局的各属性取值解释
    mysql explain extended 查看 执行计划
  • 原文地址:https://www.cnblogs.com/laohaozi/p/12537794.html
Copyright © 2011-2022 走看看