Обычное практическое правило (прямо из руководств Intel и AMD по оптимизации) состоит в том, что каждый тип данных должен быть выровнен по своему собственному размеру. int32
должен быть выровнен по 32-разрядной границе, int64
по 64-разрядной границе и т. Д. Чар прекрасно подойдет где угодно.
Другое эмпирическое правило, конечно, "компилятору сообщили о требованиях выравнивания". Вам не нужно беспокоиться об этом, потому что компилятор знает, как добавить правильные отступы и смещения, чтобы обеспечить эффективный доступ к данным.
Единственное исключение - при работе с инструкциями SIMD, когда вы должны вручную обеспечить выравнивание на большинстве компиляторов.
Во-вторых, если это правильно, то один
следует выровнять элементы структуры данных по
8-байтовая граница. Но я видела
люди, использующие 4-байтовое выравнивание
вместо этого на этих процессорах.
Я не понимаю, как это имеет значение. Процессор может просто выдать чтение для 64-битного блока, который содержит эти 4 байта. Это означает, что он либо получает 4 дополнительных байта до запрошенных данных, либо после них. Но в обоих случаях требуется только одно чтение. 32-битное выравнивание 32-битных данных гарантирует, что они не пересекут 64-битную границу.