2011-08-26 21 views
10

Recientemente estoy trabajando en Windows y encontré que muchas estructuras de datos se definen como struct con union como variables miembro. Ejemplo de esto sería EVT_VARIANT en Windows.¿Qué es una unión?

No pude entender cuál es el propósito detrás de esto.

+0

Bien, ¿qué llevó exactamente a su pregunta? El propósito de los sindicatos es compartir el tiempo un área de memoria, es decir, almacenar los diferentes tipos de datos en diferentes momentos en la misma región de memoria. Esto puede funcionar en cualquier lugar, es decir, una unión puede usarse sola o puede usarse como miembro de una estructura. No hay absolutamente nada especial o extraño en unión siendo utilizado dentro de una estructura. Por esta razón, no está claro por qué estás preguntando esto. – AnT

Respuesta

16

Cuando un struct contiene union miembros, generalmente se realiza como un mecanismo de ahorro de espacio. Si el struct puede ser de ciertos subtipos por los cuales solo ciertos miembros son válidos, entonces un union es una buena manera de no desperdiciar espacio.

Por ejemplo

enum NumberKind { 
    Integer, 
    FloatingPoint 
}; 

struct Number { 
    NumberKind kind; 
    union { 
    int integerValue; 
    float floatValue; 
    }; 
}; 

En este escenario he definido un número de struct que puede tener tipo tipos de valores numéricos: punto flotante y entero. No es válido tener ambos al mismo tiempo, así que en lugar de perder espacio al tener ambos miembros siempre definidos, creé un union que hace que el almacenamiento de ambos sea igual al tamaño del más grande.

Ejemplo de uso de encima a lo solicitado

void PrintNumber(Number value) { 
    if (value.kind == Integer) { 
    printf("%d\n", value.integerValue); 
    } else { 
    printf("%f\n", value.floatValue); 
    } 
} 
+1

@downvoter, ¿te importa explicar? – JaredPar

+0

gracias por la explicación, pero ¿podrías explicarnos más sobre el uso de la misma? – Avinash

+1

@Avinash agregó un caso de uso de muestra – JaredPar

1

La unión en una técnica de estructura se usa generalmente cuando se quiere una estructura de estilo variante. En general, va acompañado de un identificador de tipo, que se utiliza para determinar qué elemento de la unión debe verificarse. También se ve de forma opuesta, como en Xlib on * NIX, donde es una unión con structs, con el primer miembro idéntico entre todas las estructuras, definiendo qué estructura tiene los datos que necesita.

0

unión significa que puede tener uno de sus miembros como su posible valor. En el siguiente ejemplo, verá los valores para cada uno de ellos. Pero esta unión puede ser miembro de alguna otra estructura, donde es suficiente especificar solo un valor, ya sea flotante o entero, no ambos. Espero que esto ayude.

union { 
      float u_f; 
      int u_i; 
    }var; 

    var.u_f = 23.5; 
    printf("value is %f\n", var.u_f); 
    var.u_i = 5; 
    printf("value is %d\n", var.u_i) 
3

Imagine que tiene una estructura que sostiene un paquete de datos. Los datos en el paquete pueden ser de algunos tipos diferentes, por lo que almacena el tipo en un miembro llamado tipo. Entonces, para leer los datos en este paquete, primero verifica el tipo, luego lee el miembro de datos correspondiente, que debe contener los datos en el paquete.

Sin sindicatos la estructura de datos se vería así:

struct data { 
    type_t type; 

    int number; 
    char * string; 
    double fraction; 
    long long big_number; 
} 

Ésta sería una estructura de datos bastante grande. Utiliza suficiente espacio para almacenar uno de cada tipo de datos posible. Eso es un poco innecesario cuando definitivamente solo tendrá uno de esos miembros que contenga información útil en cualquier momento.

Si utilizamos los sindicatos:

struct data { 
    type_t type; 

    union payload { 
     int number; 
     char * string; 
     double fraction; 
     long long big_number; 
    } 
} 

A continuación, la estructura incluye solamente el espacio suficiente para almacenar el tipo más uno de los miembros de carga útil (es decir, se le ha asignado una cantidad de memoria igual al tamaño de type_t plus el tamaño del miembro de carga útil más grande posible). Esto ahorra una gran cantidad de espacio y es mucho más eficiente.

Sin embargo, debe tener cuidado, ya que si la carga contiene un int, puede leerlo como un doble.Probablemente obtendrá números extremadamente extraños cuando su programa intente interpretar los datos erróneamente

3

Como una reliquia de los días cuando 64 KB era bastante memoria, tiene una función en C++ que permite compartir más de una variable el mismo recuerdo (pero, obviamente, no al mismo tiempo). Esto se llama una unión, y hay cuatro formas básicas en las que se pueden utilizar uno:

  • Se puede utilizar de manera que una variable A ocupa un bloque de memoria en un momento dado en un programa, que es tarde ocupado por otra variable B de un tipo diferente, porque A ya no es necesario. Recomiendo que no hagas esto. No vale la pena el riesgo de error que está implícito en tal arreglo. Puede lograr el mismo efecto asignando memoria dinámicamente.

  • Como alternativa, podría tener una situación en un programa donde se requiere una gran cantidad de datos, pero no sabe con anticipación de la ejecución cuál será el tipo de datos, sino que estará determinado por los datos de entrada . También recomiendo que no utilice uniones en este caso, ya que puede lograr el mismo resultado utilizando un par de punteros de diferentes tipos y, nuevamente, asignando la memoria de forma dinámica.

  • Un tercer uso posible para una unión es uno que puede necesitar de vez en cuando, cuando quiera interpretar los mismos datos en dos o más formas diferentes. Esto podría suceder cuando tienes una variable de tipo largo, y quieres tratarla como dos valores de tipo corto. Windows a veces incluirá dos valores cortos en un solo parámetro de tipo pasado hace mucho tiempo a una función. Se presenta otra instancia cuando desea tratar un bloque de memoria que contiene datos numéricos como una cadena de bytes, solo para moverlo.

  • Puede usar una unión como un medio para pasar un objeto o un valor de datos alrededor de donde no se sabe de antemano cuál será su tipo. La unión puede proporcionar el almacenamiento de cualquiera de los posibles tipos de tipos que pueda tener.

Si usted piensa que soy un genio en explicar lo que es una unión y parte de ella es posibles aplicaciones, no puedo tomar crédito por esto. (: Esta información provino de Ivor Horton's Beginning Visual C++ 2010 que casualmente tengo aquí en mi escritorio. Espero que esto haya sido útil.

Cuestiones relacionadas