其中关于内存和寄存器的左值和右值

时间:2018-09-04 11:53:25

标签: c++ compilation lvalue

我想我问错了问题...

问题是,从c ++源代码到具有中间汇编步骤的机器语言代码的路径是什么?
因此,当编译器开始将源代码转换为汇编代码时,它会做一些重要的事情:

int x {1};  

由编译器转换为三件事:

  • 名称x
  • x对象的地址
  • 此地址的字节数由x的类型决定。

[编者注:OP忘记了“用值1初始化x的代码”]

因此在计算机级别上,此地址有地址和该值的字节数, 我认为这就是所谓的左值。

但是,如果编译器将一个值放入处理器寄存器中,但未在内存中为其提供地址,则该值在源代码中将表示为rvalue。

我想知道这种理解是否正确,并且建议的重复项未回答该问题。

2 个答案:

答案 0 :(得分:1)

不。您的理解不正确。没有什么可以阻止编译器将x放入寄存器的-除非它需要x的地址(因为代码其他部分对x的其他引用)。

非常粗略的说,lvalue是可以分配给它或使用其地址的东西(使用&运算符); rvalue是表达式的结果。

当然,如果您声明了x const,则实际上无法为其赋值-但这并不能阻止它成为左值。

答案 1 :(得分:0)

您遇到的方法错误。 C ++语言规范指定了如何理解C ++源代码。这包括定义的含义,例如int x{1}。该标准还告诉我们x是左值。

编译器知道x是一个左值,但这在生成代码时不是很重要。知道这是一个左值会告诉您您可以做什么x。编译器完全知道您中使用x所做的事情。如果您根本不使用x,则编译器甚至可能完全忽略x