A veces un programa manejará diferentes tipos de datos
utilizando la misma variable. En esta situación, se tienen dos
elecciones: se puede crear un struct
que contenga todos
los posibles tipos que se puedan necesitar almacenar, o se puede
utilizar una union
. Una union
amontona toda la
información en un único espacio; calcula la cantidad de espacio
necesaria para el elemento más grande, y hace de ese sea el
tamaño de la union
. Utilice la union
para
ahorrar memoria.
Cuando se coloca un valor en una union
, el valor
siempre comienza en el mismo sitio al principio de la
union
, pero sólo utiliza el espacio necesario. Por eso,
se crea una «super-variable» capaz de alojar
cualquiera de las variables de la union
. Las
direcciones de todas las variables de la union
son la
misma (en una clase o struct
, las direcciones son
diferentes).
A continuación, un uso simple de una union
. Intente
eliminar varios elementos y observe qué efecto tiene en el
tamaño de la union
. Fíjese que no tiene sentido
declarar más de una instancia de un sólo tipo de datos en una
union (a menos que quiera darle un nombre distinto).
//: C03:Union.cpp // The size and simple use of a union #include <iostream> using namespace std; union Packed { // Declaration similar to a class char i; short j; int k; long l; float f; double d; // The union will be the size of a // double, since that's the largest element }; // Semicolon ends a union, like a struct int main() { cout << "sizeof(Packed) = " << sizeof(Packed) << endl; Packed x; x.i = 'c'; cout << x.i << endl; x.d = 3.14159; cout << x.d << endl; } ///:~
Listado 3.49. C03/Union.cpp
El compilador realiza la asignación apropiada para el miembro de la unión seleccionado.
Una vez que se realice una asignación, al compilador le da igual
lo que se haga con la unión. En el ejemplo anterior, se puede
asignar un valor en coma-flotante a x
:
x.f = 2.222;
Y luego enviarlo a la salida como si fuese un int
:
cout << x.i;
Eso produciría basura.