Я знаю, что некоторые архитектуры ЦП не поддерживают равноудаленный адресный доступ (например, архитектуры ARM до ARM 4 не имели инструкций для доступа к объектам полуслова в памяти). И какой-то компилятор (например, некоторая версия GCC) для этой архитектуры будет использовать серию доступа к памяти, когда обнаруживает смещенный адрес, так что смещенный доступ почти прозрачен для разработчиков (см. Окончательное руководство по GCC, Уильям фон Хаген)
Но мне интересно, как компилятор знает, выравнивается ли адрес или нет? В конце концов, то, что видит компилятор, это виртуальный адрес (эффективный адрес, EA), если он видит что-либо. Когда программа запускается, EA может быть сопоставлена с любым физическим адресом ОС. Даже если виртуальный адрес выровнен, результирующий физический адрес может быть смещен, не так ли? Выравнивание физического адреса - это то, что действительно имеет значение, и передача по адресным строкам ЦП.
Поскольку компилятор вообще не знает о физическом адресе, как он может быть достаточно умным, чтобы узнать, выровнен ли адрес переменной?