Union (programación)

De Wikipedia, la enciclopedia libre
Saltar a: navegación, búsqueda

En programación, una union es un valor que puede poseer varias representaciones o formatos; o una Estructura de datos que consiste en una variable que puede almacenar dicho valor. Algunos lenguajes de programación admiten tipos de datos especiales, llamados union types, para describir dichos valores y variables.

Dependiendo del lenguaje y del tipo, un valor union puede ser usado en operaciones como, por ejemplo, asignación o comparación de igualdad, sin necesidad de saber su tipo específico. Por el contrario, otras operaciones si que requieren saber el tipo de dato — ya sea por medio de información externa, o por el uso de un tagged union.


A causa de sus limitaciones de uso, las uniones son normalmente proveídas en lenguajes untyped o en modo inseguro (como en C). Tienen la ventaja sobre tagged unions por no necesitar espacio para guardar el tag.

El nombre "union" proviene de la definición formal de type. Si uno mira el type como el Conjunto de todos los valores que ese type puede ser, un union type es simplemente la Unión de conjuntos de los types que lo constituyen, puesto que es capaz de almacenar cualquier valor que puedan sus elementos. Además, puesto que la unión matemática evita los duplicados, si más de un campo puede almacenar un valor común, es imposible decir, a partir del valor, qué campo fue el último en ser escrito.

Unions en varios lenguajes de programación[editar]

C/C++[editar]

En C y C++, los untagged unions son expresados casi igual que los struct excepto que cada miembro empieza en la misma dirección de memoria. Los elementos, en los structs, no necesitan ser valores simples, de hecho, pueden ser structs e incluso unions. Por otra parte, C++ no permite a un elemento ser de cualquier tipo que tenga un full fledged constructor/destructor y/o copy constructor, o una copia no-trivial del operador de asignación. En particular, es imposible tener cadenas de caracteres estandar de C++ como miembro de una union. El objeto union ocupa tanto espacio como el elemento más grande que lo compone, mientras que los structs necesitan al menos el mismo espacio que la suma de los tamaños de todos sus elementos. Esta ganancia en espacio, muy útil en algunos casos, implica un gran coste en seguridad: la lógica del programa debe asegurarse de que solo se lee el último elemento en ser escrito por todos los posibles caminos que lleve el programa al ejecutarse.

La principal ventaja de la union es el ahorro de espacio, ya que proporciona una manera de guardar varios tipos de datos en el mismo espacio. Las unions proporcionan también polimorfismo. Pero, no se comprueba el tipo de los datos, así que es tarea del programador asegurarse que se accede correctamente en todos los posibles contextos. El elemento más relevante de la variable union es normalmente determinado por el estado de otra variable, probablemente dentro de un struct.

Un uso común de las unions en C es lo que en C++ se llama reinterpret_cast, asignando los datos a un elemento de la union y leyendo de otro, para códigos que dependen de la representación cruda de los valores. Aunque esta no es una forma segura de usar las unions.

Structure and union specifiers have the same form. [ . . . ] The size of a union is sufficient to contain the largest of its members. The value of at most one of the members can be stored in a union object at any time. A pointer to a union object, suitably converted, points to each of its members (or if a member is a bit-field, then to the unit in which it resides), and vice versa.

ANSI/ISO 9899:1990 (the ANSI C standard) Section 6.5.2.1