Учебники

D Программирование — Союзы

Объединение — это специальный тип данных, доступный в D, который позволяет хранить разные типы данных в одной и той же ячейке памяти. Вы можете определить объединение со многими членами, но только один член может содержать значение в любой момент времени. Союзы предоставляют эффективный способ использования одной и той же области памяти для нескольких целей.

Определение союза в D

Чтобы определить объединение, вы должны использовать оператор объединения очень похожим образом, как при определении структуры. Оператор union определяет новый тип данных с более чем одним членом для вашей программы. Формат заявления объединения следующий:

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

Тег объединения является необязательным, и каждое определение члена является обычным определением переменной, например int i; или плавать f; или любое другое допустимое определение переменной. В конце определения объединения перед последней точкой с запятой вы можете указать одну или несколько переменных объединения, но это необязательно. Вот как вы можете определить тип объединения с именем Data, который имеет три члена i , f и str.

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

Переменная типа данных может хранить целое число, число с плавающей запятой или строку символов. Это означает, что одна переменная (та же ячейка памяти) может использоваться для хранения нескольких типов данных. Вы можете использовать любые встроенные или определенные пользователем типы данных внутри объединения в зависимости от ваших требований.

Память, занятая профсоюзом, будет достаточно большой, чтобы вместить самого крупного члена профсоюза. Например, в приведенном выше примере тип данных будет занимать 20 байт пространства памяти, поскольку это максимальное пространство, которое может занимать символьная строка. В следующем примере показан общий объем памяти, занимаемый вышеуказанным объединением —

Live Demo

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; 
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

Memory size occupied by data : 20 

Доступ к членам Союза

Чтобы получить доступ к любому члену профсоюза, мы используем оператор доступа члена (.) . Оператор доступа к члену кодируется как точка между именем переменной объединения и членом объединения, к которому мы хотим получить доступ. Вы бы использовали ключевое слово union для определения переменных типа union.

пример

Следующий пример объясняет использование union —

Live Demo

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); 
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

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

Здесь вы можете видеть, что значения членов i и f объединения были повреждены, потому что окончательное значение, присвоенное переменной, заняло место в памяти, и это является причиной того, что значение члена str печатается очень хорошо.

Теперь давайте снова посмотрим на тот же пример, где мы будем использовать одну переменную за раз, что является основной целью объединения —

Модифицированный пример

Live Demo

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); 
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

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

Здесь все участники печатаются очень хорошо, потому что один член используется за один раз.