Упаковка и выравнивание байта, как описано в C FAQ здесь :
Это для выравнивания. Много процессоров не могут получить доступ 2-и 4-байтовые количества (например, ints и длинные целые), если они переполнены в во все стороны.
предположим у Вас есть эта структура:
struct { char a[3]; short int b; long int c; char d[3]; };
Теперь, Вы могли бы думать, что должно быть возможно упаковать эту структуру в память как это:
+-------+-------+-------+-------+ | a | b | +-------+-------+-------+-------+ | b | c | +-------+-------+-------+-------+ | c | d | +-------+-------+-------+-------+
, Но очень, намного легче на процессоре, если компилятор располагает его как это:
+-------+-------+-------+ | a | +-------+-------+-------+ | b | +-------+-------+-------+-------+ | c | +-------+-------+-------+-------+ | d | +-------+-------+-------+
В упакованной версии, заметьте, как Вам и мне, по крайней мере, немного трудно видеть, как b и c поля повторяются? Короче говоря это трудно для процессора, также. Поэтому большинство компиляторов дополнит структуру (как будто с дополнительными, невидимыми полями) как это:
+-------+-------+-------+-------+ | a | pad1 | +-------+-------+-------+-------+ | b | pad2 | +-------+-------+-------+-------+ | c | +-------+-------+-------+-------+ | d | pad3 | +-------+-------+-------+-------+