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)  
    
  • 相关阅读:
    解决异常:“The last packet sent successfully to the server was 0 milliseconds ago. ”的办法
    关于时间复杂度
    关于如何在MyEclipse下修改项目名包名,以及类
    Error filterStart
    类A是公共的,应在名为A.java的文件中声明错误
    Eclipse快捷键大全
    JVM 是用什么语言写的?
    退出cmd命令
    Java 如何对文件进行多个Object对象流的读写操作
    SublimeText2 快捷键一览表
  • 原文地址:https://www.cnblogs.com/laohaozi/p/12537793.html
Copyright © 2011-2022 走看看