2012-08-02 26 views
12

Según mi conocimiento, de forma predeterminada se realizará la alineación de 4 bytes. dicen¿Por qué el relleno no está sucediendo en este caso?

typedef struct 
{ 
    int data7; 
    unsigned char data8; 
    //3 -bytes will be added here. 
}Sample1; 

por lo sizeof(Sample1) habrá 8.

Sin embargo, para la siguiente estructura, ¿por qué relleno no se ha pasado ?.

typedef struct 
{ 
    unsigned char data1; 
    unsigned char data2; 
    unsigned char data3; 
    unsigned char data4; 
    unsigned char data5; 
    unsigned char data6; 

}Sample2; 

Pero el sizeof (Sample2) está a sólo 6. ¿Esta Sample2 no es una estructura alineada de 4 bytes?

EDITAR ::

Según Wiki

alineación de datos significa poner los datos a un desplazamiento igual a un múltiplo del tamaño de la palabra, lo que aumenta el rendimiento del sistema de memoria debido a la forma en que la CPU maneja la memoria.

Pero los miembros de Sample2 no se alinearán en múltiplos de dos ¿no?

Gracias.

+2

buena pregunta +1 – Angus

Respuesta

20

Ninguno de los campos en su segunda estructura requiere una alineación de 4 bytes. unsigned char solo necesita alineación de 1 byte. Por lo tanto, no es necesario alinearlo realmente a 4 bytes.

Las estructuras generalmente solo están alineadas con la alineación máxima de todos los campos.

+9

Para la edición: Ese "tamaño de palabra" no es necesariamente el mismo que el tamaño de palabra nativo del procesador. Si los tipos de datos son más pequeños, se puede aplicar un tamaño de palabra más pequeño. Por ejemplo, en x86, no hay penalización de rendimiento para acceder a un 'char' en una dirección' mod 4! = 0'. Pero habrá si intenta acceder a un 'int' de 4 bytes con' mod 4! = 0' porque cruza un límite de alineación de 4 bytes. – Mysticial

+1

Gracias @Mystical. Respuesta muy necesaria. Esto es lo que estoy buscando. – Jeyaram

5

data7 es un artículo de 4 bytes, por lo que el compilador normalmente intente alinearla a una dirección que es un múltiplo de 4.

data1 es un artículo de un byte, por lo que el compilador no tratarán de alinearlo a cualquier límite particular (es decir, no habría ganancia real al hacerlo).

3

No, en una implementación típica Sample2 no es una estructura alineada de 4 butes. Es una estructura alineada de 1 byte.

En una implementación típica, el requisito de alineación de toda la estructura se calcula como máximo del requisito de alineación de sus miembros individuales. Esta es la razón por su Sample1 tiene requisito de alineación de int (4 de la plataforma), y su Sample2 tiene requisito de alineación de unsigned char, que es 1.

1

Char requiere 1 byte alineación. El tipo de datos máximo es char, que es una alineación de un byte, por lo tanto, está obteniendo el tamaño como '6'.

Puede consultar este sitio para obtener más información. http://www.geeksforgeeks.org/archives/9705. Lo han explicado en detalle.

Cuestiones relacionadas