c++ - 反汇编中的引用类型和指针

标签 c++ compiler-construction pointers reference

为什么引用类型和指针在编译后的代码中相同?(你可以在第三和第四行看到)。我试图弄清楚,但显然我无法实现。

如果引用类型变量必须在声明时初始化并且不能更改,那么是否需要像指针那样进行间接寻址?

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 。

此外,我怀疑您没有启用编译器优化 - 使用您的代码并使用 yi 及其地址调用各种函数,在 VC++ 中进行快速测试2005 的优化显示编译器没有将 i 实现为指针,而是作为 y 的真正别名(即,每当传递 i 或者&i,编译器直接使用y的地址。

如果您正在查看编译器的调试输出,您应该不会感到惊讶,它总是在幕后将引用视为指针。

关于c++ - 反汇编中的引用类型和指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1501341/

相关文章:

c++ - 为什么我会在这个迭代器中遇到段错误?

c++ - Qt tableView - 添加颜色

c++ - 在 C++ 应用程序中动态使用 libmysql.dll

c++ - 如何使用static_cast来解析重载函数?

java - 我应该如何使用自定义编译器管理内存?

C 释放指向指针的指针

C++——指向结构数组的指针包含指向不起作用的类数组的指针

c++ - 为什么需要在 VS 中为 packaged_task 复制构造函数

Conio.o 在 Dev C 中不可用 - C

java - 为什么 Eclipse 会编译它,而 javac 不会?