关于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)