Рассмотрим следующую структуру, где a
и c
являются 32-битными словами, а b
является байтом.
|-----------a-----------|--b--|-----------c-----------|
| : : : : : : : | :
Если вы разместите эту структуру на 64-битной границе, то a
и b
будут правильно выровнены, а c
- нет, поскольку она пересекает 64-битную границу слова. Фактически, невозможно расположить эту структуру без толкания a
или c
за такую границу.
На практике компиляторы обычно принимают такое определение:
struct {
int a;
char b;
int c;
};
и расположите его так:
|-----------a-----------|--b--| padding |-----------c-----------|
| : : : : : : : | : : : :
Так что ни одно из значений не пересекает границу выравнивания. Но в программировании драйвера структуры часто должны быть упакованы (то есть без заполнения), чтобы соответствовать форматам структуры данных по проводам или на диске. В этот момент вы можете вступить в борьбу, если вы не распакуете границы слов вручную.