Una pregunta de uniones

Iniciado por _niu, 14 Julio 2011, 14:09 PM

0 Miembros y 1 Visitante están viendo este tema.

_niu

Hola gente, me presento soy brkpnt.... jajja que apodo tan ocurrente (?).

Resulta que estoy aprendiendo a programar en C++, y estoy teniendo un problema teorico, con las uniones, que no me ocupan el espeacio esperado. El java me quemo el cerebro.

Código (cpp) [Seleccionar]

union casa{
int direccion;
char nombre [34];
double pisos;
} casa;
int main() {
        //no importa por que puse suma ;)
cout<<"suma de longitudes: "<< sizeof casa.direccion<<" "<<sizeof casa.nombre<<" "<<sizeof casa.pisos<<endl;
cout<<"Longitud total: "<<sizeof casa;
return 0;
}


lo que me regresa es:

suma de longitudes: 4 34 8
Longitud total: 40

segun tengo entendido ocuparia la lontitud de la variable con mayor tamaño pero en realidad, se va a justando a medida que cambio los tipos y sus longitudes. Quiero decir que si cambio los tipos me respeta el echo de obtener el tamño del mas grande, pero en otros casos sobrepasa el tamño del mas grande (no solo en potencias de 2, xdd).

la pregunta seria ¿como funciona esta agrupacion de bytes? ¿No debe tomar siempre el tamaño del mas grande?

Desde ya muchas gracias por desponder la pregunta noob. ;)
std::cout<<Mi wiki personal<<"Nada es inalcanzable\n";

rir3760

Cita de: brkpnt en 14 Julio 2011, 14:09 PMla pregunta seria ¿como funciona esta agrupacion de bytes? ¿No debe tomar siempre el tamaño del mas grande?
No necesariamente.

En C y C++ los "agregados" (estructuras y uniones) permiten utilizar su dirección en memoria como la dirección en memoria de su primer campo (estructuras) o cualquiera de ellos (uniones).

Para ello se debe cumplir con los requisitos de alineación. El significado de esta es simple: se almacena el objeto en una dirección múltiplo de su tamaño.


Para explicarlo mejor los requisitos de alineación de tu unión "casa" deben coincidir con los de todos sus campos, estos son:

1) tipo int (campo "direccion").
2) tipo char[34] (campo "nombre", no hay problema con este).
2) tipo double (campo "pisos").


En tu caso la unión debe almacenarse en una dirección que sea múltiplo de 4 (int) y 8 (double), como puedes imaginarte eso condiciona su tamaño (40 es múltiplo de 4 y 8).

Por supuesto hay que recordar que el tamaño de cada uno de los tipos no esta garantizado (depende de la implementación).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

_niu

Cita de: rir3760 en 14 Julio 2011, 16:23 PM
En tu caso la unión debe almacenarse en una dirección que sea múltiplo de 4 (int) y 8 (double), como puedes imaginarte eso condiciona su tamaño (40 es múltiplo de 4 y 8).

Genial!!! gracias, respuesta re clara.
Nos vemos :)
std::cout<<Mi wiki personal<<"Nada es inalcanzable\n";