2012-03-28 17 views
6

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?

+1

Co to jest kompilator i jaka jest architektura? – ouah

+1

gcc 4.4.5 na x86-64 –

+0

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. –

Odpowiedz

6

Jest całkowicie zależny od kompilatora i architektury. W twoim przypadku wygląda na to, że pola rzeczywiście są wyrównane do 8 bajtów, być może ze względu na wydajność.

2

Domyślam się, że domyślnie wszystko na architekturze 64-bitowej zostanie wyrównane do granic 64-bitowych, tak jak w architekturze 32-bitowej wszystko jest wyrównane do 4 bajtów. Możesz określić zasady pakma pragma, aby pozbyć się dopełnienia. Na przykład:

#pragma pack(0) 

w gcc.

+0

O dziwo, jeśli zrobię pack (1), to dwumodułowa obudowa struct nadal daje mi 16, ale jeśli dodaję do niego jeszcze jeden uint32_t, otrzymam 20 ... zagadek –