Это экономит кремний в логике адресации, если вы можете сделать определенные предположения об адресе (например, "нижние n
биты равны нулю). Некоторые процессоры (x86 и их рабочие аналогы) будут использовать логику, чтобы повернуть неверно выровненные данныев несколько выборок, скрывая некоторые неприятные потери производительности от программиста. Большинство процессоров за пределами этого мира вместо этого вызовут аппаратную ошибку, недвусмысленно объясняющую, что им это не нравится.
Все аргументы, которые выуслышать о «эффективности» - это глупости или, если быть более точным, вопрос напрашивается. Реальная причина заключается в том, что он просто экономит кремний в ядре процессора, если количество битов адреса можно уменьшить для операций. Любая неэффективность, возникающая из-за неправильного доступа(как и в мире x86) являются результатом решений по проектированию аппаратного обеспечения, а не присуще решению в целом.
Теперь, как говорится, для большинства случаев использования решение по проектированию аппаратного обеспечения имеет смысл.данные в двухбайтовых словах, большинствов общих случаях использования у вас есть доступ к offset
, затем offset+2
, затем offset+4
и так далее.Способность увеличивать адрес побайтно при доступе к двухбайтовым словам, как правило (как, конечно, в 99,44%), не то, что вы хотите делать.Таким образом, не мешает требовать, чтобы смещения адресов выравнивались по границам слов (это легкое, одноразовое неудобство при проектировании структур данных), но это действительно экономит ваш кремний.
Как историческийКроме того, я однажды работал над Interdata Model 70 - 16-разрядным мини-компьютером.Требуется, чтобы весь доступ к памяти был выровнен по 16 битам.К тому времени у меня было очень мало памяти, когда я работал над ней по меркам того времени.(Это было пережитком даже тогда.) Выравнивание слов использовалось, чтобы удвоить объем памяти, так как подключенный ЦП можно было легко взломать.Была добавлена новая логика декодирования адреса, которая заняла 1 в младшем бите адреса (ранее была ошибка выравнивания при создании) и использовала его для переключения на второй банк памяти.Попробуйте это без логики выравнивания!:)