На самом деле есть только два основных применения.Первое - создать дискриминационный союз.Это, вероятно, то, что вы думали о «оптимизации пространства», но есть кое-что еще к этому.Вам нужен дополнительный бит данных, чтобы узнать, какой член объединения является «живым» (содержит действительные данные), поскольку компилятор не делает этого за вас.Обычно вы видите такой код, имеющий объединение внутри структуры, что-то вроде:
struct mixed {
enum { TYPE_INT, TYPE_FLOAT } type;
union {
int int_value;
float float_value;
} data;
};
При назначении либо data.int_value, либо data.float_value вы должны установить тип членак соответствующему значению перечисления.Тогда ваш код, использующий смешанное значение, может выяснить, следует ли читать int_value или float_value.
Вторым значительным применением союзов является предложение API, который позволяет пользователю обращаться к одним и тем же данным несколькими способами.Это довольно ограничено, поскольку требует, чтобы все типы в объединении были помещены в память одинаковыми способами.Например, int и float совершенно разные, и доступ к float в виде целого числа не дает вам особо значимых данных.
Для полезного примера этого варианта использования посмотрите, сколько сетевых API-интерфейсов определитобъединение для адресов IPv4, что-то вроде:
union ipv4addr {
unsigned address;
char octets[4];
};
Большая часть кода просто хочет передать 32-битное целочисленное значение, но некоторый код хочет прочитать отдельные октеты (байты).Это все выполнимо с приведением указателей, но это немного проще, более самодокументируется и, следовательно, немного безопаснее использовать объединение таким образом.
В общем, если вы не уверены, что вынужен союз, вам почти наверняка он не нужен.