Основное правило: типы данных должны быть выровнены.Выравнивание должно быть таким же, как байты, необходимые для хранения типа (округленные до степени 2), например:
type size align (bytes)
char 1 1
short 2 2
int 4 4
float 4 4
int64_t 8 8
double 8 8
long double (x87, 80 bit) 10 16
_float128 16 16
int128_t 16 16
Некоторые архитектуры, например SPARC, запрещают доступ к данным, если он не выровнен на 4байты, поэтому один символ будет иметь 4-байтовое выравнивание, и даже на архитектурах, которые допускают такое поведение, он может быстрее получить доступ к данным, сохраненным с таким выравниванием;таким образом, локальные переменные в полях стека и структуры часто имеют заполнение для достижения этого, если у вас есть смесь типов разных размеров, хотя это поведение можно изменить, если это необходимо.
Кэш быстрее с выравниваниембольше, чем просто размер слова (не 32 и 64 бит, но с размером строки кэша, например, 16 байтов, или 32 байта, или 64 байта).
Некоторые более широкие инструкции, такие как SSE2 (шириной 128 бит) или двойной плавающей точкой64-битная ширина) быстрее (или иногда не будет работать) для выравнивания собственной ширины (если вам нужно загрузить 128-битные данные, вы должны выровнять их по 128 битам).
DMA и подкачка памяти требуют еще большего выравнивания,но это обычно получается манипулированием указателем.
OpenCL (GPGPU) иногда требует огромного выравнивания из-за очень широких шин DDR и ограничений доступа к памяти ядра GPU: http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/attributes-variables.html
/* a has alignment of 128 */
__attribute__((aligned(128))) struct A {int i;} a;