为什么引用类型和指针在编译后的代码中相同?(你可以在第三和第四行看到)。我试图弄清楚,但显然我无法实现。
如果引用类型变量必须在声明时初始化并且不能更改,那么是否需要像指针那样进行间接寻址?
int x = 10;
mov dword ptr [x],0Ah
int y = x;
mov eax,dword ptr [x]
mov dword ptr [y],eax
int &i = y;
lea eax,[y]
mov dword ptr [i],eax
int *p = &x;
lea eax,[x]
mov dword ptr [p],eax
p = &i;
mov eax,dword ptr [i]
mov dword ptr [p],eax
x = i;
mov eax,dword ptr [i]
mov ecx,dword ptr [eax]
mov dword ptr [x],ecx
最佳答案
如果编译器知道引用总是引用单个特定对象/项目,那么编译器当然可以优化间接寻址。
然而,大多数引用实际上是在运行时绑定(bind)的。即使无法重新绑定(bind)引用的特定实例,特定范围的不同执行或包含引用成员的对象的不同实例可能会在引用绑定(bind)到每个实例的不同对象的情况下运行。使用间接寻址是编译器处理此问题的一种便捷方式。
引用仅绑定(bind)到单个事物的情况可能相对不常见,以至于编译器可能不会寻找优化 - 特别是因为在大多数情况下优化可能不会带来明显的 yield 。
此外,我怀疑您没有启用编译器优化 - 使用您的代码并使用 y
和 i
及其地址调用各种函数,在 VC++ 中进行快速测试2005 的优化显示编译器没有将 i
实现为指针,而是作为 y
的真正别名(即,每当传递 i
或者&i
,编译器直接使用y
的地址。
如果您正在查看编译器的调试输出,您应该不会感到惊讶,它总是在幕后将引用视为指针。
关于c++ - 反汇编中的引用类型和指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1501341/