2012-03-28 30 views
6

Tengo curiosidad acerca de la alineación de los tipos uint32_t en las plataformas de 64 bits. La especificación dice que uint32_t debe ser exactamente el ancho de bits dada, lo que de hecho parece ser:alineación uint32_t en 64 bits?

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

Pero luego tengo una estructura:

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

Pero, sorprendentemente:

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

¿Está uint32_t alineado por 8 bytes por alguna razón? ¿Es realmente un tipo de 8 bytes debajo?

+1

¿Qué es el compilador y qué es la arquitectura? – ouah

+1

gcc 4.4.5 en x86-64 –

+0

Tenga en cuenta que debido a la forma en que las matrices funcionan, el requisito de alineación de 'uint32_t' * debe * ser menor o igual que' sizeof (uint32_t) '. Debido al requisito de que no haya relleno en los tipos 'uintN_t',' sizeof (uint32_t) * CHAR_BIT == 32'. Cualquier otra cosa no es conforme a C99. Sin embargo, la alineación de su 'estructura A' está permitida por C99 para ser mayor la alineación más grande de cualquier miembro. –

Respuesta

6

Es completamente dependiente de su compilador y arquitectura. En su caso, parece como si los campos estuvieran efectivamente alineados en 8 bytes, tal vez por motivos de rendimiento.

2

Supongo que, por defecto, todo en la arquitectura de 64 bits se alineará con los límites de 64 bits, al igual que en la arquitectura de 32 bits, todo está alineado con 4 bytes. Puede especificar las directivas de empaque pragma para deshacerse del relleno. Por ejemplo

#pragma pack(0) 

en gcc.

+0

Por extraño que parezca, si hago el paquete (1), entonces el caso struct de dos elementos anterior todavía me da 16, pero si agrego uno más uint32_t, obtengo 20 ... desconcertante –

Cuestiones relacionadas