Programación D - Uniones

UN uniones un tipo de datos especial disponible en D que le permite almacenar diferentes tipos de datos en la misma ubicación de memoria. Puede definir una unión con muchos miembros, pero solo un miembro puede contener un valor en un momento dado. Las uniones proporcionan una forma eficaz de utilizar la misma ubicación de memoria para múltiples propósitos.

Definiendo una unión en D

Para definir una unión, debe usar la declaración de unión de una manera muy similar a como lo hizo al definir la estructura. La declaración de unión define un nuevo tipo de datos, con más de un miembro para su programa. El formato de la declaración de unión es el siguiente:

union [union tag] { 
   member definition; 
   member definition; 
   ... 
   member definition; 
} [one or more union variables];

los union tages opcional y cada definición de miembro es una definición de variable normal, como int i; o flotar f; o cualquier otra definición de variable válida. Al final de la definición de la unión, antes del punto y coma final, puede especificar una o más variables de unión, pero es opcional. Esta es la forma en que definiría un tipo de unión llamado Data que tiene los tres miembrosi, fy str -

union Data { 
   int i; 
   float f; 
   char str[20]; 
} data;

Una variable de Datatype puede almacenar un entero, un número de punto flotante o una cadena de caracteres. Esto significa que se puede usar una sola variable (la misma ubicación de memoria) para almacenar múltiples tipos de datos. Puede utilizar cualquier tipo de datos integrado o definido por el usuario dentro de una unión según sus requisitos.

La memoria que ocupa un sindicato será lo suficientemente grande como para albergar al miembro más grande del sindicato. Por ejemplo, en el ejemplo anterior, el tipo de datos ocupará 20 bytes de espacio de memoria porque este es el espacio máximo que puede ocupar una cadena de caracteres. El siguiente ejemplo muestra el tamaño de memoria total ocupado por la unión anterior:

import std.stdio; 
  
union Data { 
   int i; 
   float f; 
   char str[20]; 
}; 
  
int main( ) { 
   Data data; 

   writeln( "Memory size occupied by data : ", data.sizeof);

   return 0; 
}

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:

Memory size occupied by data : 20

Acceso a miembros de la unión

Para acceder a cualquier miembro de un sindicato, utilizamos el member access operator (.). El operador de acceso a miembros está codificado como un punto entre el nombre de la variable de unión y el miembro de la unión al que deseamos acceder. Usaría la palabra clave union para definir variables de tipo union.

Ejemplo

El siguiente ejemplo explica el uso de union:

import std.stdio;

union Data { 
   int i; 
   float f; 
   char str[13]; 
};  

void main( ) { 
   Data data; 
   
   data.i = 10; 
   data.f = 220.5; 
   
   data.str = "D Programming".dup; 
   writeln( "size of : ", data.sizeof); 
   writeln( "data.i : ", data.i); 
   writeln( "data.f : ", data.f); 
   writeln( "data.str : ", data.str); 
}

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:

size of : 16 
data.i : 1917853764 
data.f : 4.12236e+30 
data.str : D Programming

Aquí, puede ver que los valores de i y f miembros del sindicato se corrompieron porque el valor final asignado a la variable ha ocupado la ubicación de memoria y esta es la razón por la que el valor de str El miembro se imprime muy bien.

Ahora veamos el mismo ejemplo una vez más, donde usaremos una variable a la vez, que es el propósito principal de tener unión:

Ejemplo modificado

import std.stdio;

union Data { 
   int i; 
   float f; 
   char str[13]; 
};  
void main( ) { 
   Data data; 
   writeln( "size of : ", data.sizeof);  
   
   data.i = 10; 
   writeln( "data.i : ", data.i); 
   
   data.f = 220.5; 
   writeln( "data.f : ", data.f);  
   
   data.str = "D Programming".dup; 
   writeln( "data.str : ", data.str); 
}

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:

size of : 16 
data.i : 10 
data.f : 220.5 
data.str : D Programming

Aquí, todos los miembros se imprimen muy bien porque se utiliza un miembro a la vez.