C++ 指令集如何区分值和引用

C++ 指令集如何区分值和引用,c++,memory,assembly,C++,Memory,Assembly,让我们看看这段代码: int main () { int a = 5; int&b = a; cout << a << endl; // 5 is displayed cout << b << endl; // 5 is also displayed return 0; } 问题: 两个std::cout指令非常相似,如何区别对待a和b?简言之:它没有 CPU本身并不关心哪种类型存储在哪里,

让我们看看这段代码:

int main ()
{
    int a = 5;
    int&b = a;

    cout << a << endl;  // 5 is displayed
    cout << b << endl;  // 5 is also displayed

    return 0;
}
问题:

两个std::cout指令非常相似,如何区别对待
a
b

简言之:它没有

CPU本身并不关心哪种类型存储在哪里,它只执行编译器生成的指令

编译器知道
b
是一个引用,而不是
int
。因此,它指示CPU将
b
视为指针

如果查看程序的汇编代码,您将看到访问
a
b
的指令不同:
b
的部件包含一条额外指令

mov (%rax),%eax
这是解引用步骤。(在这个汇编表示法中,括号表示去引用,所以这个指令的意思类似于eax=*rax)。

简而言之:它不是

CPU本身并不关心哪种类型存储在哪里,它只执行编译器生成的指令

编译器知道
b
是一个引用,而不是
int
。因此,它指示CPU将
b
视为指针

如果查看程序的汇编代码,您将看到访问
a
b
的指令不同:
b
的部件包含一条额外指令

mov (%rax),%eax

这是解引用步骤。(在这个汇编符号中,括号表示取消引用,所以这个指令的意思类似于eax=*rax)。

我想您绝对没有要求优化。即使 然后,我希望访问
a
和访问
b
生成 完全相同的代码(至少在本例中)

关于编译器如何知道:
a
b
有不同的 类型,因此编译器知道如何处理它们。这个 标准的设计目的是将
int&
替换为
int*const
, 然后在每次访问时自动取消引用(除 初始化)将导致一致的实施;看起来
你的编译器就是这样做的。

我想你根本没有要求优化。即使 然后,我希望访问
a
和访问
b
生成 完全相同的代码(至少在本例中)

关于编译器如何知道:
a
b
有不同的 类型,因此编译器知道如何处理它们。这个 标准的设计目的是将
int&
替换为
int*const
, 然后在每次访问时自动取消引用(除 初始化)将导致一致的实施;看起来
编译器就是这样做的。

这不是CPU所做或理解的事情。这就是语言的规则。您的编译器告诉CPU取消引用该引用。这不是CPU所做或理解的事情。这就是语言的规则。您的编译器告诉CPU取消引用该引用。为了更清楚,我已将我的问题注明日期,我没有看到用于获取a值和b引用的值的指令集有什么区别。对于
coutahwait,为什么该指令会取消引用?是括号吗?!?没错
(%rax)
表示“存储在
rax
中的地址处的内存”。啊,我不知道这一点。谢谢!请更新您的答案,以便我接受:)为了更清楚,我已将我的问题注明日期,我没有发现用于获取a值和b引用值的指令集有任何差异。对于
coutahwait,为什么该指令会取消引用?是括号吗?!?没错
(%rax)
表示“存储在
rax
中的地址处的内存”。啊,我不知道这一点。谢谢!请更新您的答案,以便我接受:)不是指向常量整数的指针吗?你是说
int*const
?@fjardon是的。我已经修好了。谢谢。难道不是指向常量整数的指针吗?你是说
int*const
?@fjardon是的。我已经修好了。谢谢