В таких языках, как адреса C и C++ объектов со статической продолжительностью хранения, можно указать адресные константы. Это означает, что концептуально на уровне языка они обрабатываются так, как будто их значения «известны» во время компиляции.
Конечно, в действительности это не так, когда дело касается вопроса. Чтобы противостоять тому, что комбинация компилятор-компоновщик-загрузчик должна реализовать динамический механизм, который обеспечил бы полную поддержку концепции уровня языка постоянной адреса. Интуитивно механизм на основе GOT, основанный на полном обращении вовремя, будет намного дальше от этой концепции, чем механизм, основанный на перемещении времени.
С одной стороны, язык C был разработан как язык, который не требует динамической инициализации объектов со статической продолжительностью хранения, то есть концептуально нет инициализирующего кода запуска и никаких проблем, связанных с порядком инициализации. Но в реализации на основе GOT инициализация глобальной переменной с такой постоянной адреса потребует кода запуска, чтобы извлечь фактическое значение из GOT и поместить его в переменную. Между тем подход, основанный на перемещении, создает полную иллюзию такой глобальной переменной, начинающей свою жизнь с надлежащей ценности без кода запуска.
Если вы посмотрите на функции, предоставляемые механизмом перемещения, вы заметите, что они синхронизированы с спецификацией C константы адреса. Например. конечное значение может включать добавление фиксированного смещения, которое должно действовать как реализация на стороне загрузчика операторов C []
и ->
, допустимых в выражениях константы C-адреса.