3.8.4. Cómo ahorrar memoria con union

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.