浏览 3326 次
锁定老帖子 主题:基本类型的传值方式
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-08-08
先看看基本类型的传值方式: 写了3个方法。反编译看看。 void fun1(int a){ a ++; } void fun2(int &a){ a++; } void fun3(int *a){ (*a)++; } fun1的汇编代码: push ebp mov ebp, esp mov eax, dword ptr ss:[ebp+8] add eax, 1 mov dword ptr ss:[ebp+8], eax pop ebp retn fun2的汇编代码: push ebp mov ebp, esp mov eax, dword ptr ss:[ebp+8] mov ecx, dword ptr ds:[eax] add ecx, 1 mov edx, dword ptr ss:[ebp+8] mov dword ptr ds:[edx], ecx pop ebp retn fun3的汇编代码: push ebp mov ebp, esp mov eax, dword ptr ss:[ebp+8] mov ecx, dword ptr ds:[eax] add ecx, 1 mov edx, dword ptr ss:[ebp+8] mov dword ptr ds:[edx], ecx pop ebp retn fun2和fun3的汇编代码一模一样。给我感觉。引用跟指针一样? 在看看调用的: int a = 0; fun1(a); 汇编1: mov dword ptr ss:[ebp-4], 0 mov eax, dword ptr ss:[ebp-4] push eax call 00401000 ;函数fun1的地址 int b =1; fun2(b); 汇编2: mov dword ptr ss:[ebp-8], 1 lea edx, dword ptr ss:[ebp-8] push edx call 00401010 ;函数fun2的地址 int c =2; fun3(&c); 汇编3: mov dword ptr ss:[ebp-C], 2 lea ecx, dword ptr ss:[ebp-C] push ecx call 00401030 ;函数fun3的地址 汇编1 把a的值压入栈,传值的拷贝; 汇编2 汇编3 分别是把 b ,c的地址压入栈 ,都是传值的地址。 给我感觉。引用是指针的语法糖? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-08-09
引用跟指针本来就是一码事。
|
|
返回顶楼 | |
发表时间:2007-08-09
七猫 写道 引用跟指针本来就是一码事。
谢谢指教。 |
|
返回顶楼 | |
发表时间:2007-08-09
xlincn 写道 七猫 写道 引用跟指针本来就是一码事。
谢谢指教。 引用是被绑了链子的指针。从效率来讲没有差别。 |
|
返回顶楼 | |
发表时间:2007-08-10
从传参数的角度看,引用和指针一样。但是实际上经过编译器优化后,两者的效率差别很大。
引用是右值,引用的值可以直接帮定在寄存器中。而指针就不行了。 |
|
返回顶楼 | |