Почему у нас есть выравнивание, если память адресуется по байту? - PullRequest
1 голос
/ 08 сентября 2011

Поскольку мы можем адресовать каждый байт памяти индивидуально, почему компиляторы проявляют особую осторожность, чтобы убедиться, что структуры и их элементы соответствуют 32-битным границам в памяти? Я могу ошибаться, но на 32-битной системе не так быстро получить 4 байта, начиная с 0x0800, как с 0x0801?

Ответы [ 2 ]

3 голосов
/ 08 сентября 2011

На большинстве архитектур быстрее выполнять чтение / запись для естественно выровненных типов данных. В некоторых системах будет сгенерировано исключение (т. Е. crash в большинстве случаев), если вы попытаетесь получить доступ к определенным типам, когда они не выровнены. В общем, вы всегда хотите поддерживать естественное выравнивание, если у вас нет веских причин не делать этого.

См. Также связанные вопросы и ответы SO:

2 голосов
/ 08 сентября 2011

Взято из Википедии :

Например, когда размер слова компьютера составляет 4 байта (байт означает 8 бит), данные, которые должны быть прочитаны, должны иметь смещение памяти, кратное 4. Если это не так, например, данные начинаются с 14-го байта вместо 16-го байта, затем компьютер должен прочитать два 4-байтовых блока и выполнить некоторые вычисления до того, как запрошенные данные будут прочитаны, или это может вызвать ошибку выравнивания. Даже если предыдущая структура данных заканчивается 14-м байтом, следующая структура данных должна начинаться с 16-го байта. Два байта заполнения вставляются между двумя структурами данных, чтобы выровнять следующую структуру данных с 16-м байтом

Память должна быть multiple of 4 bytes для более быстрого доступа и reduce computation для better performance. таким образом, если память является адресно-байтовой адресацией, обычно состоящей из 4-х байтовых блоков, то в большинстве случаев мы знаем, где будет начинаться следующий адрес, например. как объяснено выше, также, если вы получите 14 bytes (это должно быть 16 байтов 4 * 4 = 16), то вы знаете, сколько отступов вы должны использовать 16-14 = 2 bytes padding. вот почему заполнение используется в не выровненной памяти.

...