InicioApuntes Y Monografias[C++] Alineamiento de memoria en structs/clases
Que tul? En este post voy a mostrar la diferencia entre dos porciones de codigo. El ejemplo es sencillo para mostrar una perdida de espacio en algo que puede parecer minimo.

A primera vista son estructuras identicas.



struct test{
    short int a;
    double b;
    int c;

};



struct test{
    double b;
    int c;
    short int a;
};





Sin embargo, al analizar el tamaño de un arreglo de esta estructura (de tamaño 10000), se ve que son dos distintos. Hay una diferencia de 80.000 bytes de tamaño.


Primer código



Segundo código.







Explicación


La razón es que el campo de tipo double impone un alineamiento de memoria tal que la dirección donde está ese dato sea divisible por 8. Sin embargo, los otros tipos de datos tienen distinto alineamiento (8 bytes para double, 4 bytes para int, 2 bytes para short int). Si comentamos los codigos:



struct test{
    short int a; //2 bytes
    //6 bytes no usados para alinear el double
    double b; //8 bytes
    int c; //4 bytes
    //4 bytes no usados

}; //tamaño de 24 bytes



struct test{
    double b; //8 bytes, no debo alinear
    int c; //4 bytes, no debo alinear
    short int a; //2bytes
   //2 bytes, completo los 8 bytes. Podría definir otro short int sin costo adicional.
}; //tamaño de 16 bytes




Esto ocurre tambien en atributos de una clase.

Gracias por pasar. Fijate mis otros post de codigo memoria :



Datos archivados del Taringa! original
116puntos
286visitas
12comentarios
Actividad nueva en Posteamelo
0puntos
0visitas
0comentarios
Dar puntos:

Posts Relacionados

Dejá tu comentario

0/2000
12 Comentarios archivados
Del Taringa! original
N@NeedMessiS7/12/2017+1-0
Yo programo en .net y si bien en la facu vi lo que expone tu post, jamas en mi puta vida lo he usado. Supongo que para los sistemitas pindorcha que hago no hace falta enroscarse tanto. Salu2
M@MPucheta7/12/2017+0-0
En java pasa algo parecido, pero es mas bardero detectar la mejora porque no hay sizeof().
P@Perrorror777/12/2017+0-0
Piece of cake...
f@ferefsf7/12/2017+1-1
Buen dato, no lo sabía. Sólo aprendí lo básico, pero trato de aunque sea de a poco ir aprendiendo algo más. En java pasa algo parecido?
P@Pendejo8887/12/2017+0-0
Chabon un boludo como yo entra a leer esto y parece ingenieria termonuclear avanzada
C@Caesar967/12/2017+1-2
Wow, no entendí una mierda.Me siento decepcionado de mi mismo.Que libros necesito leer para entender esto?
s@sluvoni7/12/2017+0-0
word aligment de la memoria de los sistemas x86.... Los datos en posiciones impares son accedidos mas lento que los pares en las viejas PCs
D@Diegonv40MPucheta7/12/2017+1-0
@MPucheta ah ok,i lo del alineamiento si lo entendi.
M@MPucheta7/12/2017+0-0
En memoria los miembros del struct se guardan de acuerdo a como se definieron. Pero si, podrias pensar que se guardan como un array, uno atrás de otro, con la diferencia que en los struct se agregan esos bytes no usados para el alineamiento.
D@Diegonv407/12/2017+1-0
Yo nunca use struct (solo se masomenos por la secundaria (tecnica) y por hobby). struct es como una clase, pero se organiza en la memoria, como si fuera un bloque unido? algo asi como los array que los valores van uno atras del otro (fisicamente)?
M@MPucheta7/11/2017+1-0
Gracias por pasar y por la aclaración! No quería sobrecargar mucho el post porque si no no lo lee nadie
n@nrs10227/11/2017+4-0
Buena descripción del problema. Hay que mencionar que la alineación se realiza para lograr un rendimiento óptimo de la aplicación bajo la arquitectura en la que se lo ha compilado (Ejemplo: x86). Las fronteras de alineamiento tienen relación con la arquitectura del procesador empleada, así que los resultados en otras arquitecturas también pueden variar (para bien o para mal). Si el tamaño de la estructura es un problema, se puede utilizar el "#pragma pack (1)", o bien especificando " __attribute…

Autor del Post

M
MPucheta🇦🇷
Usuario
Puntos0
Posts16
Ver perfil →
PosteameloArchivo Histórico de Taringa! (2004-2017). Preservando la inteligencia colectiva de la internet hispanohablante.

CONTACTO

18 de Septiembre 455, Casilla 52

Chillán, Región de Ñuble, Chile

Solo correo postal

© 2026 Posteamelo.com. No afiliado con Taringa! ni sus sucesores.

Contenido preservado con fines históricos y culturales.