Существует значительное различие между использованием литерала и использованием переменной на уровне машинного кода (или ассемблера):
Как правило, литерал может быть закодирован непосредственно в машинном коде, тогда как может потребоваться загрузкасначала значение другой переменной из памяти, если такая задействована.
На самом деле, ваш вариант 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
)?