关注
关于引用的问题看来有所争议,严谨起见,我还是实验了一下,C++代码如下: int main(){
int a = 1;
scanf_s("%d", &a);
int &ya = a;
printf("%d %d\n", a, ya+1);
system("pause");
return 0;
} VS2015,DEBUG模式下生成了如下的汇编代码: int a = 1;
mov dword ptr [a],1
scanf_s("%d", &a);
lea eax,[a]
push eax
push offset string "%d" (01E6B30h)
call _scanf_s (01E10F5h)
scanf_s("%d", &a);
add esp,8
int &ya = a;
lea eax,[a]
mov dword ptr [ya],eax
printf("%d %d\n", a, ya+1);
mov eax,dword ptr [ya]
mov ecx,dword ptr [eax]
add ecx,1
push ecx
mov edx,dword ptr [a]
push edx
push offset string "%d %d\n" (01E6B34h)
call _printf (01E132Ah)
add esp,0Ch
很明显看到, int &ya = a; 这一句下面的反汇编,意思是“把a的地址装进寄存器eax,再把eax寄存器的值放到ya所在的地址段”。 很明显说明了,ya有自己独立的地址空间,在试图打印ya+1的值的时候: mov eax,dword ptr [ya]
mov ecx,dword ptr [eax]
这两行的意思是取ya地址段中的值(也就是&a,即a变量的地址)进寄存器eax,再将以“eax中的值作为地址”取四字节数字进ecx,两步合计相当于*(&a)。 另外对于RELEASE模式的代码,显然编译器聪明多了: printf("%d %d\n", a, ya+1);
mov ecx,dword ptr [a]
lea eax,[ecx+1]
push eax
push ecx
push offset string "%d %d\n" (03B210Ch)
这里就很接近原文说的“引用是别名”之类的概念了。 当然这种级别的优化下,变量很可能一直生活在寄存器中,简单的函数调用也很容易被自动内联展开。此时再去讨论什么地址的问题有点本末倒置,因为连原始变量绝大多数时间都不在内存里了。
查看原帖
8 评论
相关推荐
02-22 19:09
Flinders University 运营 点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 你感受到金三银四了嘛? #
29924次浏览 315人参与
# 25届网易互娱暑实进度 #
99009次浏览 768人参与
# 今天你投了哪些公司? #
51675次浏览 1108人参与
# 26届的你们有几段实习? #
169841次浏览 1099人参与
# 春招 / 实习投递,你最焦虑的一件事 #
28850次浏览 645人参与
# 米哈游笔试 #
537555次浏览 981人参与
# Tplink求职进展汇总 #
206235次浏览 948人参与
# 虽然0面试,但今天___,夸夸自己 #
2492次浏览 74人参与
# AI项目实战 #
2594次浏览 122人参与
# 为了实习逃课值吗? #
69037次浏览 536人参与
# 如果给AI员工评绩效,我的答案是…… #
4116次浏览 98人参与
# HR问:你期望的薪资是多少?如何回答 #
82847次浏览 711人参与
# 今年找实习到底有多难? #
8868次浏览 95人参与
# 27届求职交流 #
42113次浏览 858人参与
# 大城市找工作会更容易吗 #
61945次浏览 390人参与
# 哪一刻你对工作祛魅了? #
9357次浏览 102人参与
# 找工作,你都让AI帮你做什么? #
2589次浏览 104人参与
# AI时代下,你的岗位要求有什么变化? #
4587次浏览 99人参与
# 26届求职交流 #
21704次浏览 536人参与
# 签约/解约注意事项 #
887113次浏览 4713人参与
