关于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)  
posted @ 2018-11-21 22:06  老耗子  阅读(73)  评论(0编辑  收藏  举报