elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Una pregunta de uniones
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Una pregunta de uniones  (Leído 1,530 veces)
_niu

Desconectado Desconectado

Mensajes: 34



Ver Perfil
Una pregunta de uniones
« 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. ;)


En línea

std::cout<<Mi wiki personal<<"Nada es inalcanzable\n";
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Una pregunta de uniones
« Respuesta #1 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


En línea

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

Desconectado Desconectado

Mensajes: 34



Ver Perfil
Re: Una pregunta de uniones
« Respuesta #2 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 :)
En línea

std::cout<<Mi wiki personal<<"Nada es inalcanzable\n";
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Las uniones en C
Programación C/C++
josacost1890 1 1,456 Último mensaje 16 Agosto 2017, 11:07 am
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines