Основное правило: типы данных должны быть изначально выровнены. Выравнивание должно быть таким же, как байты, необходимые для хранения типа (округленные до степени 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 бит) или double float (ширина 64 бита), быстрее (или иногда не работают) для выравнивания исходной ширины (если вам нужно загрузить 128-битные данные, вы должны выровнять их до 128 бит).
DMA и пейджинг памяти требуют еще большего выравнивания, но это обычно достигается путем манипулирования указателями.
OpenCL (GPGPU) иногда требует серьезного согласования из-за очень широких шин DDR и ограничений доступа к памяти ядра графического процессора: 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;
person
osgx
schedule
04.08.2011