cpp-uniones

Uniones en C++

Una unión en C++ es una estructura de datos que permite almacenar diferentes tipos de datos en la misma ubicación de memoria.

A diferencia de las estructuras (structs), donde cada miembro tiene su propia área de almacenamiento, en las uniones, todos los miembros comparten la misma área de memoria.

Esto significa que una unión puede tener varios miembros, pero solo un miembro puede contener un valor en un momento dado.

Las uniones se utilizan cuando se necesita almacenar diferentes tipos de datos en una misma variable, pero solo se necesita acceder a uno de ellos en un momento determinado.

En general, no es una estructura que debáis usar frecuentemente. Sólo tiene sentido en el caso de algunas optimizaciones de memoria (en general, no son habituales).

Sintaxis básica

La sintaxis básica para definir una unión es similar a la de una estructura (struct), pero utilizando la palabra clave union en lugar de struct.

union NombreUnion {
    tipo_de_dato1 miembro1;
    tipo_de_dato2 miembro2;
    // Más miembros
};

Por ejemplo,

union Dato {
    int entero;
    float flotante;
    char caracter;
};

En este ejemplo, Dato es una unión que puede contener un entero, un flotante o un caracter (pero solo uno de ellos a la vez).

Acceso a los miembros de una unión

Para acceder a los miembros de una unión, se utiliza la misma sintaxis que para acceder a los miembros de una estructura (struct), utilizando el operador de punto (`.“).

Dato dato;
dato.entero = 10;
std::cout << "Valor del entero: " << dato.entero << std::endl;

En este ejemplo, se accede al miembro entero de la unión dato y se le asigna un valor.

Tamaño de una unión

El tamaño de una unión es igual al tamaño del miembro más grande. Esto se debe a que la unión reserva suficiente espacio en memoria para almacenar el miembro más grande, y todos los demás miembros comparten la misma ubicación de memoria.

union Dato {
    int entero;
    char cadena[10];
};

std::cout << "Tamaño de la unión Dato: " << sizeof(Dato) << std::endl; // Imprimirá el tamaño de un int

En este ejemplo, el tamaño de la unión Dato será igual al tamaño de un entero, ya que el miembro entero es el más grande.

Uso de uniones para ahorrar memoria

Las uniones pueden utilizarse para ahorrar memoria cuando se necesita almacenar diferentes tipos de datos en una misma ubicación de memoria, pero solo se necesita acceder a uno de ellos en un momento dado.

union Valor {
    int entero;
    float flotante;
};

Valor v;
v.entero = 10;
std::cout << "Valor del entero: " << v.entero << std::endl;

En este ejemplo, se utiliza una unión Valor para almacenar un entero o un flotante en la misma ubicación de memoria. Esto permite ahorrar memoria en comparación con el uso de variables separadas para cada tipo de dato.

Al utilizar uniones, es importante tener en cuenta algunas restricciones y consideraciones

  • Acceso concurrente: Solo se puede acceder a uno de los miembros de la unión en un momento dado. Cambiar el valor de un miembro puede afectar el valor de los otros miembros.
  • Almacenamiento compartido: Todos los miembros comparten la misma ubicación de memoria, por lo que modificar un miembro puede afectar a los demás.
  • Tipos incompatibles: Los tipos de datos almacenados en una unión deben ser compatibles entre sí en términos de tamaño y alineación en memoria.