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是的。我已经修好了。谢谢