引用和值传递

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的地址再取地址里的值,而值传递直接取值

从效率上看,引用的效率要低一点。

何时使用引用,应当根据实际使用情况判断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值