Я думаю, что вы недооцениваете Союзы.
Идея использования Союзов схождение сохранить память ...
да, это одна из причин
... и получить результат эквивалентен структуре ...
no
Это не эквивалент. Они выглядят похожими в исходном коде, но это совершенно другая вещь. Как яблоки и самолеты.
Союзы - это очень и очень низкоуровневая конструкция, которая позволяет вам видеть часть памяти, как будто она хранит любой из ее «членов», но вы можете использовать только по одному за раз в. Даже использование слова «член» крайне вводит в заблуждение. Их следует называть «взглядами» или чем-то, а не членами.
Когда вы пишете:
union ABCunion
{
int a;
double b;
char c;
} myAbc;
Вы говорите: «возьмите кусок памяти, достаточно большой для самой большой среди в междунар, полукокса и двойной, и позволяет называть его myAbc.
В этой памяти, теперь вы можете хранить либо ИНТ, или двойной, или полукокса. Если вы храните int, а затем сохраняете double, int уходит навсегда.
Какой смысл?
Для Союзов существует два основных вида использования.
а) дискриминированных хранения
Это то, что мы делали выше. Я выбираю часть памяти, и я даю ей разные значения в зависимости от контекста. Иногда контекст явственен (вы сохраняете некоторую переменную, которая указывает, какой «вид» переменной вы сохранили), а иногда она может быть неявной (на основе раздела кода вы можете указать, какой из них должен использоваться). В любом случае, код должен быть в состоянии понять это, или вы не сможете сделать ничего разумного с переменной.
Типичный (явный) пример может быть:
struct MyVariantType
{
int typeIndicator ; // type=1 -> It's an int,
// type=2 -> It's a double,
// type=3 -> It's a char
ABCunion body;
};
Например, VB6 в «Варианты» являются профсоюзы не в отличии от выше (но более сложного).
b) Разделение изображения Иногда это полезно, когда вам нужно видеть переменную как «целую» или как комбинацию деталей. Легче объяснить на примере:
union DOUBLEBYTE
{
struct
{
unsigned char a;
unsigned char b;
} bytes;
short Integer;
} myVar;
Вот короткий int "объединенный" с парой байтов. Теперь вы можете просмотреть то же значение, что и короткий int (myVar.Integer), или просто так же легко изучить отдельные байты, которые составляют часть значения (myVar.bytes.a и myVar.bytes.b).
Обратите внимание, что это второе использование не переносится (я уверен,); это означает, что он не гарантирует работу на разных машинных архитектурах; но это использование абсолютно необходимо для задач, для которых был разработан C (реализация ОС).
Да, я понимаю идею этой логики, но я хочу использовать объединение вместо структуры, чтобы использовать меньшее пространство памяти, и я могу получить все значения (при использовании некоторых операций или так далее). Идея использования объединения заключается в пространственной памяти. – AGeek
Идея использования объединения заключается в том, чтобы сэкономить память и получить результат, эквивалентный структуре, выполнив какую-то или любую операцию. – AGeek
Нет, идея союза состоит в том, чтобы сделать такую же память доступной, как и разные типы. Храните поплавок и, например, прочитайте его битовый шаблон в int. Вы не можете просто «уменьшить использование памяти». – greyfade