В struct a
у вас есть 4-байтовое целое число, 1-байтовый символ, заполнение 3 байта для выравнивания float
по 4-байтовой границе и 4 байта для float
. На некоторых машинах и для некоторых структур у вас может быть до 7 байт, заполненных между char
и следующими double
, как в struct f
:
struct f
{
char a;
double b;
};
Нет никаких альтернативных размеров для struct b
ни при каких обстоятельствах, о которых я могу думать.
При struct c
компилятор может размещать последовательные элементы без каких-либо дополнений, поскольку ни один из элементов в структуре не требует более строгого выравнивания. Если у вас было:
struct d
{
short a;
char b;
char c;
char d;
};
было бы разумно ожидать, что размер будет 6 (если не 8), потому что short
должен быть выровнен на 2-байтовой границе.
struct e
{
int a;
char b;
};
На многих платформах sizeof(struct e)
будет 8, потому что структура должна быть выровнена в 4 байта.
Макрос __WORDSIZE
имеет мало общего с этим. Это не стандартизированный макрос.