04月17, 2007

C++函数调用中的引用和指针

C++初学者对函数调用中的引用总是感到十分迷惑

下面就研究一下

先看下面三个函数

void f1(int a,intb) //按值传递
{
     a=0;
     b=3;
}

void f2(int &a,int &b) //按引用传递
{
     a=0;
     b=3;
}

void f3(int *a,int *b) //按指针传递
{
     *a=0;
     *b=3;
}

要想知道他们之间的区别,最好的方法是看看编译器究竟干了什么 用cl.exe 的-Fa参数,生成对应源代码的汇编代码,摘要如下

按值传递

PROC NEAR 
push ebp
mov ebp, esp
;直接将压入栈的2个参数赋值为0和3
mov DWORD PTR _a$[ebp], 0
mov DWORD PTR _b$[ebp], 3
pop ebp
ret 0

按引用传递

PROC NEAR

push ebp
mov ebp, esp
;将压入栈的参数作为指针,将0和3赋值给指针所指向的内存单元
mov eax, DWORD PTR _a$[ebp]
mov DWORD PTR [eax], 0
mov ecx, DWORD PTR _b$[ebp]
mov DWORD PTR [ecx], 3
pop ebp
ret 0

按指针传递

PROC NEAR

push ebp
mov ebp, esp
;可以看到,按引用传递和按指针传递的汇编代码一模一样
;但是使用引用,我们不必再用星号解引用了,这样提高了代码的可读性
;语言层面,引用的用法和对象一样;在二进制层面,引用一般都是通过指针来实现的,
;只不过编译器帮我们完成了转换
mov eax, DWORD PTR _a$[ebp]
mov DWORD PTR [eax], 0
mov ecx, DWORD PTR _b$[ebp]
mov DWORD PTR [ecx], 3
pop ebp
ret 0

引用既具有指针的效率,又具有变量使用的方便性和直观性

本文链接:http://aztack.wang/post/ref-pointer-in-cpp-fun-call.html

-- EOF--

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。