2012-03-28 14 views
6

Sono curioso sull'allineamento dei tipi uint32_t su piattaforme a 64 bit. La specifica dice che uint32_t dovrebbe essere esattamente il bitwidth dato, che in effetti sembra essere:allineamento uint32_t su 64-bit?

> printf("sizeof(uint32_t): %zd\n", sizeof(uint32_t)); 
sizeof(uint32_t): 4 

Ma poi ho una struct:

typedef struct A { 
    uint32_t a; 
    uint32_t b; 
} A; 

Ma, a sorpresa:

> printf("sizeof(A): %zd\n", sizeof(A)); 
sizeof(A): 16 

È uint32_t che è allineato a 8 byte per qualche motivo? È davvero un tipo da 8 byte sotto?

+1

Che cos'è il compilatore e qual è l'architettura? – ouah

+1

gcc 4.4.5 su x86-64 –

+0

Si noti che a causa del modo in cui funzionano gli array, il requisito di allineamento di 'uint32_t' * deve * essere minore o uguale a' sizeof (uint32_t) '. A causa del requisito che non ci sia riempimento nei tipi 'uintN_t',' sizeof (uint32_t) * CHAR_BIT == 32'. Qualsiasi altra cosa non è conforme a C99. Tuttavia, l'allineamento della tua 'struct A' è permesso da C99 per essere il più grande allineamento di qualsiasi membro. –

risposta

6

Dipende interamente dal compilatore e dall'architettura. Nel tuo caso sembra che i campi siano effettivamente allineati a 8 byte, forse per motivi di prestazioni.

2

La mia ipotesi è che per impostazione predefinita tutto sull'architettura a 64 bit sia allineato ai limiti a 64 bit come sull'architettura a 32 bit tutto è allineato a 4 byte. È possibile specificare le direttive di imballaggio pragma per sbarazzarsi del padding. Ad esempio

#pragma pack(0) 

in gcc.

+0

Stranamente, se faccio pack (1), allora il caso struct two-element sopra mi dà ancora 16, ma se aggiungo un altro uint32_t ad esso, ottengo 20 ... sconcertante –