#include <stdio.h>
typedef struct __attribute__((packed)) {
union {
int x[2];
float y[3];
} u;
double z;
} Tp;
typedef struct {
union {
int x[2];
float y[3];
} u;
double z;
} T;
typedef struct __attribute__((packed, aligned(16))) {
union {
int x[2];
float y[3];
} u;
double z;
} Ta16;
int main(void) {
printf("sizeof(Tp) == %lu\n", sizeof(Tp));
printf("sizeof(T) == %lu\n", sizeof(T));
printf("sizeof(Ta16) == %lu\n", sizeof(Ta16));
return 0;
}
Ścisła odpowiedź więc brzmi: "To zależy jakiego wyrównania wymaga dana platforma sprzętowa" :-). Domyślnie struktury bez specjalnych zabiegów (typ T), wyrównywane są do wartości zakresu pamięci specyficznej dla danej platformy systemowej. Atrybut packed, powoduje ich upakowanie ale kosztem (nieco) wolniejszego dostępu do składowych. Ostatni typ (Ta16) podałem jako przykład wymuszenia wyrównania do podanego zakresu.
Dodatkowo (szczególnie z tego powodu że to pytanie dotyczy programowania niskopoziomowego), warto zwrócić uwagę że int może mieć najmniej 2 bajty czyli 16 bitów.... bądź więcej :-) http://en.cppreference.com/w/c/language/arithmetic_types (ostatnia tabelka).