[go: up one dir, main page]

En programación, una unión 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 unión 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 sin tipado o en modo inseguro (como en C). Tienen la ventaja sobre las uniones etiquetadas por no necesitar espacio para guardar el tag.

El nombre "unión" 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 unión 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.

Unión en distintos lenguajes de programación

editar

En C y C++, las uniones son expresados casi igual que los struct excepto que cada miembro empieza en la misma dirección de memoria. Los elementos, al igual que en los structs, no necesitan ser valores simples, de hecho, pueden ser structs e incluso uniones. 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 estándar de C++ como miembro de una unión. El objeto unión 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 unión es el ahorro de espacio, ya que proporciona una manera de guardar varios tipos de datos en el mismo espacio. Las uniones 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 unión es normalmente determinado por el estado de otra variable, probablemente dentro de un struct.

Un uso común de las uniones en C es lo que en C++ se llama reinterpret_cast, asignando los datos a un elemento de la unión 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 uniones.


Pascal

editar

El lenguaje de programación Pascal permite crear uniones de manera muy similar a la manera en que sea crean las estructuras (cambiando "Estruc" por "Union"). El principal uso de las uniones es para interpretar un valor de un tipo de dato en otro tipo de dato, por ejemplo interpretar los bytes de un valor flotante como un entero. En este ejemplo el valor flotante no es convertido a un entero, sino que los bytes que lo componen se interpretan como un entero. A diferencia de C/C++ las uniones en Pascal pueden contener cadenas de caracteres, al igual que estructuras y otras uniones.