Ciekawi mnie wyrównanie typów uint32_t na platformach 64-bitowych. Spec mówi, że uint32_t powinna być dokładnie podana bitwidth, który rzeczywiście wydaje się być:uint32_t wyrównanie w 64-bitowym?
> printf("sizeof(uint32_t): %zd\n", sizeof(uint32_t));
sizeof(uint32_t): 4
Ale wtedy mam struct:
typedef struct A {
uint32_t a;
uint32_t b;
} A;
ale zaskakująco:
> printf("sizeof(A): %zd\n", sizeof(A));
sizeof(A): 16
Czy z jakiegoś powodu uint32_t jest wyrównany do 8 bajtów? Czy to naprawdę typ 8-bajtowy pod spodem?
Co to jest kompilator i jaka jest architektura? – ouah
gcc 4.4.5 na x86-64 –
Należy zauważyć, że ze względu na sposób działania tablic, wymóg wyrównania 'uint32_t' * musi * być mniejszy lub równy' sizeof (uint32_t) '. Z powodu wymogu braku dopełnienia w typach "uintNt", 'sizeof (uint32_t) * CHAR_BIT == 32'. Coś innego jest niezgodne z C99. Jednak wyrównanie twojej "struktury A" jest dozwolone przez C99, aby być większym największym wyrównaniem dowolnego elementu. –