gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:32:39 24 4
gpt4 key购买 nike

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

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com