首先是编写的实验程序,很简单的交换两个整型值
#include <iostream>
using namespace std;
void swap1(int * p1, int * p2)
{
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
void swap2(int & p1, int & p2)
{
int tmp = p1;
p1 = p2;
p2 = tmp;
}
int main()
{
int a = 2, b=3;
int &c = a;
int &d = b;
cout << a << b << endl;
cout << c << d << endl;
swap1(&a, &b);
cout << a << b << endl;
cout << c << d << endl;
swap2(a, b);
cout << a << b << endl;
cout << c << d << endl;
return 0;
}
swap1函数的反汇编形式:
<pre name="code" class="cpp">5: {
00401570 push ebp
00401571 mov ebp,esp
00401573 sub esp,44h
00401576 push ebx
00401577 push esi
00401578 push edi
00401579 lea edi,[ebp-44h]
0040157C mov ecx,11h
00401581 mov eax,0CCCCCCCCh
00401586 rep stos dword ptr [edi]
6: int tmp = *p1;
00401588 mov eax,dword ptr [ebp+8]
0040158B mov ecx,dword ptr [eax]
0040158D mov dword ptr [ebp-4],ecx
7: *p1 = *p2;
00401590 mov edx,dword ptr [ebp+8]
00401593 mov eax,dword ptr [ebp+0Ch]
00401596 mov ecx,dword ptr [eax]
00401598 mov dword ptr [edx],ecx
8: *p2 = tmp;
0040159A mov edx,dword ptr [ebp+0Ch]
0040159D mov eax,dword ptr [ebp-4]
004015A0 mov dword ptr [edx],eax
9: }
swap2函数的反汇编形式
12: {
004015C0 push ebp
004015C1 mov ebp,esp
004015C3 sub esp,44h
004015C6 push ebx
004015C7 push esi
004015C8 push edi
004015C9 lea edi,[ebp-44h]
004015CC mov ecx,11h
004015D1 mov eax,0CCCCCCCCh
004015D6 rep stos dword ptr [edi]
13: int tmp = p1;
004015D8 mov eax,dword ptr [ebp+8]
004015DB mov ecx,dword ptr [eax]
004015DD mov dword ptr [ebp-4],ecx
14: p1 = p2;
004015E0 mov edx,dword ptr [ebp+8]
004015E3 mov eax,dword ptr [ebp+0Ch]
004015E6 mov ecx,dword ptr [eax]
004015E8 mov dword ptr [edx],ecx
15: p2 = tmp;
004015EA mov edx,dword ptr [ebp+0Ch]
004015ED mov eax,dword ptr [ebp-4]
004015F0 mov dword ptr [edx],eax
16: }
可以看到当函数内容基本一致,功能相同时,汇编代码完全相同。。引用时变量的别名,实际应用中其实仍是使用变量的指针进行数据的处理。