Доступ к объектам и структурам и вычисление смещения адреса

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

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

Таким образом, единственный способ, которым я могу придумать доступ к объекту или его объекту-члену, - это доступ к смещению от «базового» указателя, что означает, что для доступа к чему-либо в структуре программы требуется арифметическая операция.

Мой вопрос заключается в том, так ли это делается в профессиональных компиляторах, потому что, очевидно, такой подход добавляет некоторые накладные расходы в среду выполнения, и я сам не могу придумать никакого способа разгрузить этот процесс из среды выполнения из-за отсутствия гарантий для непротиворечивость выделения памяти и ее адреса?


person dtech    schedule 15.07.2012    source источник


Ответы (1)


Большинство компьютеров на протяжении многих десятилетий обеспечивают режимы адресации, которые позволяют указать адрес как комбинацию базы и смещения, а фактическое вычисление выполняется аппаратно без дополнительных затрат в тактовых циклах ЦП.

Более поздние (последние несколько десятилетий) компьютеры предлагают аппаратное обеспечение для виртуализации схемы памяти, а это означает, что даже если физический адрес элемента отличается при каждом запуске, его адрес в виртуальном адресном пространстве остается неизменным. Опять же, нет никаких дополнительных затрат на использование базового адреса, потому что вычисления выполняются неявно и незаметно для исполняемого двоичного кода программы.

person Sergey Kalinichenko    schedule 15.07.2012
comment
Спасибо. Является ли этот механизм специфичным для платформы или, возможно, существует стандартизированное портативное решение? Можете ли вы предоставить какую-либо ссылку на информацию о том, как воспользоваться этой функцией? Или, возможно, реализация C/C++? - person dtech; 15.07.2012
comment
@ddriver Режимы адресации зависят от процессора. Они недоступны для программистов C/C++ напрямую - компиляторы используют их при преобразовании вашего кода в сборку (индексация массива выполняется как base+offset, по крайней мере, с PDP-11 дней). Например, если вы пишете int *p = getPointer(); int x = *(p+5), большинство компиляторов сгенерируют очень эффективный доступ, который не требует сложения пяти или умножения на размер int. Будет выдана одна инструкция ЦП, чтобы выполнить базовую адресацию + адресацию со смещением. - person Sergey Kalinichenko; 15.07.2012