Выравнивание памяти является очень важной проблемой при оптимизации программы по скорости.C, как правило, язык, который, как правило, делает сильный упор на скорость, любит применять некоторые правила, которые могут ускорить выполнение программы.
Ограничение доступа к памяти с выравниванием и без выравнивания исходит непосредственно от оборудования, используемого для извлеченияданные из памяти, которые обычно извлекают их кусками, размер которых равен машинному слову.Скажем, вы хотите получить доступ к двойному слову (4 байта), хранящемуся в местоположении 101. Это означает, что контроллер памяти сначала должен (вероятно) выполнить чтение двойного слова в местоположении 100, затем еще одно чтение двойного слова в местоположении 104, изатем объедините отдельные байты из местоположений 101, 102, 103 и 104 вместе.Вся операция занимает (гипотетически) два такта.
Если вы хотите получить доступ к двойному слову в местоположении 100, такой проблемы не существует, что должно быть достаточно четко проиллюстрировано на примере, который я предоставил.
На самом деле доступ к смещенным данным является такой большой проблемой, что инструкции SSE («выровненные» версии, есть также «выровненные» версии, которые этого не делают) вызовут общую ошибку защиты, если вы попытаетесь получить доступ к смещенным данным с помощьюте.
Как правило, никогда не повредит выровнять 4-байтовые данные на 4-байтовой границе, 8-байтовые данные на 8-байтовой границе и т. д.