Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: _niu en 14 Julio 2011, 14:09 pm



Título: Una pregunta de uniones
Publicado por: _niu en 14 Julio 2011, 14:09 pm
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
  1. union casa{
  2. int direccion;
  3. char nombre [34];
  4. double pisos;
  5. } casa;
  6. int main() {
  7.        //no importa por que puse suma ;)
  8. cout<<"suma de longitudes: "<< sizeof casa.direccion<<" "<<sizeof casa.nombre<<" "<<sizeof casa.pisos<<endl;
  9. cout<<"Longitud total: "<<sizeof casa;
  10. return 0;
  11. }

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. ;)


Título: Re: Una pregunta de uniones
Publicado por: rir3760 en 14 Julio 2011, 16:23 pm
la 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


Título: Re: Una pregunta de uniones
Publicado por: _niu en 14 Julio 2011, 21:22 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 :)