c++ 将引用赋值给引用_裸指针直接赋值和引用 效率对比

本文探讨了C++中引用赋值(如`auto &p_ptr2 = p;`)与直接赋值(如`auto p_ptr = p;`)在效率上的差异。通过反汇编解读,解释了`MOV`和`LEA`指令的区别,指出`LEA`仅计算地址而`MOV`则会实际读取内存内容。实验表明,编译器优化对于已使用对象的影响较小,但在未使用对象时,优化前后代码会有区别。
摘要由CSDN通过智能技术生成

问题:

观察如下代码:

	int a = 1;
	int *p = &a;
	auto p_ptr = p;//1
	auto &p_ptr2 = p;//2

上述代码中1处和2处操作,哪个效率更高呢?

反汇编解读:

	int a = 1;
00118178  mov         dword ptr [a],1  
	int *p = &a;
0011817F  lea         eax,[a]  
00118182  mov         dword ptr [p],eax  
	auto p_ptr = p;//1
00118185  mov         eax,dword ptr [p]  
00118188  mov         dword ptr [p_ptr],eax  
	auto &p_ptr2 = p;//2
0011818B  lea         eax,[p]  
0011818E  mov         dword ptr [p_ptr2],eax  

auto p_ptr = p;//1 此处在vs的反汇编中表示的是

(MOV在汇编语言中是 数据传送指令。)

00118185  mov         eax,dword ptr [p]   //将p放到寄存器当中
00118188  mov         dword ptr [p_ptr],eax //将寄存器中的数据传送给p_ptr

-----------------------------------------------------------------------------------

auto &p_ptr2 = p;//2 此处在vs的反汇编中表示的是

(LEA 其取变量的地址)

0011818B  lea           eax,[p]   //取变量p的地址,存放在寄存器中
0011818E  mov         dword ptr [p_ptr2],eax //将寄存器中的数据传送给p_ptr

dword 双字 就是四个字节
ptr pointer缩写 即指针

汇编语言中LEA与MOV指令小结 - it610.com​www.it610.com 总结一下汇编中mov,lea指令的区别 - 渣渣爱学习 - 博客园​www.cnblogs.com

文章中写道:

( LEA AX,[1000H],作用是将内存单元[1000H]的偏移地址1000H送至AX;

MOV AX,[1000H],作用是将内存单元[1000H]的内容1234H送给AX)

What is the difference between MOV and LEA?​stackoverflow.com
22fe5c185476f64759d81e841d76ca18.png
  • LEA 加载有效地址
  • MOV 表示负载值
  • lea只执行计算,它不加载任何东西,加载意味着触摸内存
https://www.youtube.com/watch?v=mKcWIA1vKOw​www.youtube.com

有人会质疑是否和编译器优化有关系

经过验证发现,只要创建对象被使用过,其汇编release和debug是类似的。若申请了但是未使用,优化前后的代码会有区别。

如下为debug语句:

	int a = 1;
00778178  mov         dword ptr [a],1  
	int *p = &a;
0077817F  lea         eax,[a]  
00778182  mov         dword ptr [p],eax  
	auto p_ptr = p;//1
00778185  mov         eax,dword ptr [p]  
00778188  mov         dword ptr [p_ptr],eax  
	auto &p_ptr2 = p;//2
0077818B  lea         eax,[p]  
0077818E  mov         dword ptr [p_ptr2],eax  

如下为release反汇编

	int a = 1;
	int *p = &a;
	auto p_ptr = p;//1
	auto &p_ptr2 = p;//2------>未使用
	cout << &p<<p<<endl;
00E112B0  mov         ecx,dword ptr ds:[0E13040h]  
00E112B6  lea         eax,[a]  
00E112B9  push        0E11750h  
00E112BE  push        eax  
00E112BF  mov         dword ptr [p],eax  
00E112C2  lea         eax,[p]  
00E112C5  push        eax  
00E112C6  mov         dword ptr [a],1  
00E112CD  call        dword ptr ds:[0E13024h]  
00E112D3  mov         ecx,eax  
00E112D5  call        dword ptr ds:[0E13024h]  
00E112DB  mov         ecx,eax  
00E112DD  call        dword ptr ds:[0E13048h]  

使用了p_ptr2的反汇编:

        int a = 1;
	int *p = &a;
	auto p_ptr = p;//1
	auto &p_ptr2 = p;//2
	cout << &p << p << p_ptr2 << &p_ptr2<<endl;
000B12B0  mov         ecx,dword ptr ds:[0B3040h]  
000B12B6  lea         eax,[a]  
000B12B9  mov         dword ptr [p],eax  ----->新增
000B12BC  lea         eax,[p]  
000B12BF  push        0B1760h  
000B12C4  push        eax  
000B12C5  lea         eax,[a]  
000B12C8  mov         dword ptr [a],1  
000B12CF  push        eax  
000B12D0  push        eax  
000B12D1  lea         eax,[p]  
000B12D4  push        eax  
000B12D5  call        dword ptr ds:[0B3024h]  
000B12DB  mov         ecx,eax  
000B12DD  call        dword ptr ds:[0B3024h]  
000B12E3  mov         ecx,eax  
000B12E5  call        dword ptr ds:[0B3024h]  
000B12EB  mov         ecx,eax  
000B12ED  call        dword ptr ds:[0B3024h]  
000B12F3  mov         ecx,eax  
000B12F5  call        dword ptr ds:[0B3048h]  

mov和lea

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值