C++中在函数传入形参时,有两种方式,引用和值传递。
- 值传递:传入的是参数的拷贝,如果参数是一个对象,这个时候会调用这个对象的拷贝构造函数。
- 引用:传入的是参数的地址,任何对该参数的修改,都会对应到这个参数起作用。
值传递:
C++代码:
void copy(int a)
{
a = a + 1;
cout <<"Value in copy:" << a << endl;
}
int a = 0;
copy(a);
cout << "Value after copy:" << a << endl;
a = a + 1;汇编代码(x86)
00A82431 mov eax,dword ptr [a] //把内存地址a中的双字型(32位)数据赋给eax
00A82434 add eax,1 //将eax加1
00A82437 mov dword ptr [a],eax //将eax赋给内存地址a
copy(a);汇编代码(x86)
00A826D6 mov eax,dword ptr [a] //把内存地址a中的双字型(32位)数据赋给eax
00A826D9 push eax //将eax压栈
00A826DA call copy (0A8109Bh)
00A826DF add esp,4
引用:
C++代码:
void refer(int &a)
{
a = a + 1;
cout << "Value in ref:" << a << endl;
}
int a = 0;
refer(a);
cout << "Value after ref:" << a << endl;
a = a + 1;汇编代码(x86)
00A82601 mov eax,dword ptr [a] //把内存地址a中的双字型(32位)数据赋给eax
00A82604 mov ecx,dword ptr [eax] //把内存地址eax中的双字型(32位)数据赋给ecx
00A82606 add ecx,1 //将ecx加1
00A82609 mov edx,dword ptr [a] //把内存地址a中的双字型(32位)数据赋给edx
00A8260C mov dword ptr [edx],ecx //把ecx赋给edx
refer(a);
00A82721 lea eax,[a] //取变量a的地址并赋给eax
00A82724 push eax //将eax压栈
00A82725 call refer (0A81014h)
00A8272A add esp,4
通过对比两个操作中汇编的差异可以发现:
在传参时,引用传递进来的是变量a的地址,而值传递传递进来的是变量的值。
在使用时,引用会先获取a的地址再取地址里的值,而值传递直接取值。
从效率上看,引用的效率要低一点。
何时使用引用,应当根据实际使用情况判断。