2012-04-01 12 views
8

Estoy usando Code :: Blocks IDE con el compilador GNU GCC.C/C++: datos de relleno o relleno en una estructura

struct test 
{ 
    char a; 
    char e; 
    char f; 
    char b; 
    char d; 
}; 

sizeof(test) vuelve 5.

leí esta respuesta: Why isn't sizeof for a struct equal to the sum of sizeof of each member?

¿Cómo es que no hay ningún relleno después de la última char, de modo que vuelve sizeof(test)6 o 8? Hay muchas más preguntas que podría formular una vez que agregue short y int, etc. Pero creo que esta pregunta es buena por ahora. ¿El relleno no facilitaría que el procesador trabaje con la estructura?

Respuesta

10

La alineación de char es solo 1, por lo que no es necesario rellenar la estructura para cumplir con un requisito de alineación mayor.

+0

Bien, digamos que el tamaño de mi palabra es de 4 bytes. Digamos que tengo una matriz 'prueba cosas [1000]'. Mi procesador lee 'test's individuales como' char-char-char-char char-pad-pad-pad'. ¿No es necesario formatear el arreglo en la memoria de esta manera también? – newprogrammer

+0

@newprogrammer No. Será 5000 bytes, sin relleno entre los miembros de la matriz, de los miembros de la estructura. – asaelr

+0

@newprogrammer: No hay "palabras" en su estructura, por lo que la alineación necesaria para una "palabra" es irrelevante. –

1

Como en la mayoría de las veces trabaja con un miembro en el tiempo, o pasa la dirección de la estructura, al compilador no le importa alinear toda la estructura más que la alineación necesaria para sus miembros. Eso significa que si asigna esta estructura (o la pasa a la función), el procesador tendrá que leerla miembro por miembro. (y será un poco lento).