В C ++, в чем разница между литералом 3 и результатом разыменования переменной со значением 3? - PullRequest
0 голосов
/ 18 февраля 2019

Мы знаем, что если у меня есть переменная int a{3}, я могу получить адрес a по &a.И я могу получить указанное значение адреса &a на *&a, которое возвращает целое число 3.Так что сейчас у нас уже есть число 3, мы не можем сделать что-то вроде &3, чтобы получить адрес литерала, поскольку это вызовет ошибку.Но проблема в том, что мы можем успешно использовать что-то вроде *&*&a, чтобы вернуть значение 3.Как я уже говорил, *&a уже возвращает число 3, и вы не можете продолжить цепочку по нему.Почему это работает при записи как *&*&a?

1 Ответ

0 голосов
/ 18 февраля 2019

Существует значительное различие между использованием литерала и использованием переменной на уровне машинного кода (или ассемблера):

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

На самом деле, ваш вариант int b = *&a; очень близок к тому, что потребовалось бы для архитектуры чистой загрузки / хранения (без какой-либо косвенной адресации)делать (при условии, что обе переменные находятся в памяти, 0xadda - адрес переменной a, 0xdaad - адрес переменной b):

MOV Rx, ADDA; // move address of a into some register
LD  Ry, Rx;   // load value at address in register into a second one
              // (maybe there's a direct addressing mode, then both operations
              // could be a single one)
MOV Rx, DAAD;
ST  Rx, Ry;

Для сравнения, int b = 3; немного проще втот же компьютер:

MOV Rx, DAAD;
MOV Ry, 3;    // 3 directly encoded in bit pattern
ST  Rx, Ry;

ОК, возможно, у вас есть подходящий режим адресации, такой, что int b = a; может быть закодирован в одной инструкции:

MOV #DAAD, #ADDA // # indicating indirect access via address

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

Возможно, еще более интересным для вас: Как бы вы хотели, чтобы адрес некоторого значения был «мистически» закодирован в некотором битовом шаблоне некоторой команды машинного кода (часть &3)?

...