Доступ к элементам и структурам и вычисление смещения адреса
Я пишу простую виртуальную машину, и у меня есть вопрос о реализации доступа к объектам и элементам структуры.
Поскольку начальный адрес программы является произвольным при каждом запуске, и, следовательно, адрес каждого из ее объектов также произвольный.
Таким образом, единственный способ получить доступ к объекту или его элементу-члену - получить смещение от "базового" указателя, что означает, что для доступа к чему-либо в структуре программы требуется арифметическая операция.
Мой вопрос заключается в том, так ли это делается в профессиональных компиляторах, потому что, очевидно, этот подход добавляет некоторые издержки во время выполнения, и я сам не могу придумать способ выгрузить этот процесс из среды выполнения из-за отсутствия гарантий для согласованность выделения памяти и ее адрес?
1 ответ
Большинство компьютеров на протяжении многих десятилетий предоставляют режимы адресации, которые позволяют указывать адрес как комбинацию базы и смещения, а фактические вычисления выполняются на оборудовании без дополнительных затрат в тактовых циклах ЦП.
Более поздние (последние несколько десятилетий) компьютеры предлагают аппаратное обеспечение для виртуализации структуры памяти, а это означает, что даже в зависимости от физического адреса элемента при каждом запуске его адрес в виртуальном адресном пространстве остается неизменным. Опять же, нет никаких дополнительных затрат на использование базового адреса, потому что вычисления выполняются неявно и незаметно для исполняемого двоичного кода программы.