studio reales proyectos programacion libro introducción incluye herramientas fundamentos fuente español código con avanzado aplicaciones c++ c padding memory-alignment

c++ - reales - libro de android studio en español pdf



¿Por qué el tamaño de una clase depende del orden de la declaración del miembro? ¿y cómo? (2)

La razón detrás del comportamiento anterior es la alineación de la estructura de datos y el relleno . Básicamente, si está creando una variable de 4 bytes, por ejemplo, int, se alineará con un límite de cuatro bytes, es decir, comenzará desde una dirección en la memoria, que es múltiplo de 4 . Lo mismo se aplica a otros tipos de datos. Cortocircuito de 2 bytes debe comenzar desde una dirección de memoria uniforme y así sucesivamente.

Por lo tanto, si tiene un carácter de 1 byte declarado antes del int (suponga 4 byte aquí), habrá 3 bytes libres en el medio. El término común utilizado para ellos es ''acolchado''.

Alineación de la estructura de datos

Otra buena explicación pictórica.

Razón de la alineación

El relleno permite un acceso más rápido a la memoria, es decir, para la CPU, el acceso a las áreas de la memoria que están alineadas es más rápido, por ejemplo, la lectura de un entero alineado de 4 bytes puede tomar una sola llamada de lectura, como si un entero estuviera ubicado en un rango de direcciones no alineadas (por ejemplo, la dirección 0x0002 - 0x0006) , entonces se necesitarían dos lecturas de memoria para obtener este entero.

Una forma de forzar al compilador a evitar la alineación es (específicamente para gcc / g ++) usar la palabra clave '' empaquetado '' con el atributo de estructura. palabra clave empaquetada También el enlace especifica cómo forzar la alineación mediante un límite específico de su elección (2, 4, 8, etc.) utilizando la palabra clave alineada .

Mejores prácticas

Siempre es una buena idea estructurar su clase / estructura de manera que las variables ya estén alineadas con el relleno mínimo. Esto reduce el tamaño de la clase en general y reduce la cantidad de trabajo realizado por el compilador, es decir, sin reorganización de la estructura. Además, siempre se debe acceder a las variables miembro por sus nombres en el código, en lugar de intentar leer un byte específico de la estructura asumiendo que un valor se ubicaría en ese byte.

Otra pregunta útil de SO sobre la ventaja de rendimiento de la alineación

Para completar, lo siguiente aún tendría un tamaño de 8 bytes en su escenario (máquina de 32 bits), pero no mejorará ya que ahora están ocupados los 8 bytes completos , y no hay relleno.

class temp { public: int i; short s; char c; char c2; };

Alguien me explica cómo el orden de la declaración de miembro dentro de una clase determina el tamaño de esa clase.

Por ejemplo :

class temp { public: int i; short s; char c; };

El tamaño de la clase anterior es de 8 bytes.

Pero cuando el orden de la declaración de miembro se cambia como se muestra abajo

class temp { public: char c; int i; short s; };

entonces el tamaño de la clase es de 12 bytes.

¿Cómo?


class temp { public: int i; //size 4 alignment 4 short s; //size 2 alignment 2 char c; //size 1 alignment 1 }; //Size 8 alignment max(4,2,1)=4

temp [ i [0-4]; s [4-2]; c [6-7]]] -> 8 Relleno en (7-8)

class temp { public: char c; //size 1 alignment 1 int i; //size 4 alignment 4 short s; //size 2 alignment 2 };//Size 12 alignment max(4,2,1)=4

temp [ c [0-1]; i [4-8]; s [8-10]]] -> 12 Rellenos en (1-4) y (10-12)