Почему выравнивание важно? - PullRequest
6 голосов
/ 02 декабря 2010

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

У меня вопрос почему? Почему процессору x86 труднее получить данные из указателя 0x12345679, чем из указателя 0x12345678? Просто для ясности, я знаю, что сбой страницы может произойти, если данные находятся на нескольких страницах, и я понимаю, что, возможно, потребуется извлечь больше данных из памяти (одна часть для начала значения и одна для конца) , но это не всегда так, и мой вопрос не в этом. Я спрашиваю, почему это всегда медленнее?

Предположим, что память начинается с 0x10000000. Почему процессору сложнее получить 2-байтовый short от 0x10000001, чем от 0x10000002? Почему сложнее получить 4-байтовый int от 0x10000001, чем от 0x10000000? И так далее.

Ответы [ 3 ]

4 голосов
/ 02 декабря 2010

Поскольку шина данных шире, чем восемь бит.

Предположим, что шина данных имеет 32 бита.Чтобы получить 16 бит с адреса 0x10000001, он должен получить четыре байта, которые начинаются с 0x10000000, и сдвинуть значение, чтобы получить два байта посередине.

Чтобы получить 16 бит с адреса 0x10000003, он долженполучить слова, которые начинаются с 0x10000000 и 0x10000004, и использовать один байт от каждого значения.

3 голосов
/ 02 декабря 2010

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

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

1 голос
/ 02 декабря 2010

Один пример: если шина данных имеет 32 бита, а 32-битное значение не находится на 32-битной границе, байты нужно будет выбрать более чем за одну операцию и переместить, чтобы правильно загрузить значение в регистр процессора.

...