Где lvalue и rvalue относительно памяти и регистров - PullRequest
0 голосов
/ 04 сентября 2018

Кажется, я задал неправильный вопрос ...

Вопрос в том, каков путь от исходного кода на С ++ к машинному языку с промежуточным шагом сборки?
Поэтому, когда компилятор начинает преобразовывать исходный код в код сборки, он делает что-то важное:

int x {1};  

преобразуется компилятором в три вещи:

  • имя x,
  • адрес объекта x
  • количество байтов по этому адресу, определяемое типом x.

[Примечание редактора: ОП забыл "код для инициализации x со значением 1"]

так что на уровне машины есть значение и количество байтов для значения по этому адресу, и я думаю, что это то, что называется lvalue.

Но если компилятор помещает значение в регистр процессора и не дает ему адрес в памяти, то это значение представляется в исходном коде как rvalue.

Я хочу знать, верно ли это понимание, и на него не ответил предложенный дубликат.

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Вы ошиблись. Спецификация языка C ++ определяет, как понимать исходный код C ++. Это включает в себя значение определений, таких как int x{1}. Стандарт также говорит нам, что x является lvalue.

Компилятор знает, x - это lvalue, но это не очень важно при генерации кода. Знание того, что это lvalue, говорит вам, что вы можете делать с x. Компилятор точно знает, что вы делаете с x. Если вы вообще не используете x, компилятор может даже полностью исключить x!

0 голосов
/ 04 сентября 2018

Нет. Ваше понимание не правильно. Ничто не мешает компилятору помещать x в регистр - если только ему не нужен адрес для x (из-за других ссылок на x в других частях кода).

Очень грубо, lvalue - это то, что может быть назначено или получено по его адресу (с помощью оператора &); rvalue является результатом выражения.

Конечно, если вы объявили x const, вы не могли бы присвоить его - но это не мешает ему быть lvalue.

...