论坛首页 编程语言技术论坛

基本类型的传值方式

浏览 3326 次
该帖已经被评为新手帖
作者 正文
   发表时间:2007-08-08  
C++
在淘宝定了<<C++程序设计语言(特别版)>> 后天才能到货。从网上下了<<C++ Primer中文版>>的电子书看看。找找C++的感觉先。

先看看基本类型的传值方式:

写了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的地址压入栈 ,都是传值的地址。

给我感觉。引用是指针的语法糖?
   发表时间:2007-08-09  
引用跟指针本来就是一码事。
0 请登录后投票
   发表时间:2007-08-09  
七猫 写道
引用跟指针本来就是一码事。


谢谢指教。
0 请登录后投票
   发表时间:2007-08-09  
xlincn 写道
七猫 写道
引用跟指针本来就是一码事。


谢谢指教。

引用是被绑了链子的指针。从效率来讲没有差别。
0 请登录后投票
   发表时间:2007-08-10  
从传参数的角度看,引用和指针一样。但是实际上经过编译器优化后,两者的效率差别很大。
引用是右值,引用的值可以直接帮定在寄存器中。而指针就不行了。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics