Навіщо потрібне об'єднання (union) stack overflow російською

Все це зберігається упереміш в одній області пам'яті. Який в цьому сенс, адже одного разу встановивши значення

вже не вийде отримати їх назад - все перемішається? Спосіб заощадити пару байтів або пару тактів і при цьому зберегти Новомосковскбельность? Чи не писати 4 різних функції, а написати одну, яка приймає union і в ній вже вирішувати, що робити? В такому випадку чи не простіше прийняти void * і потім кастануть в той тип, який потрібен? Як приклад "Просто кастануть" наведу такий код:

Функцію принтер можна переписати як-то так:

Знову-таки який у цьому сенс, якщо я можу спочатку завести окрему змінну int a = 20; а потім зміню її значення a = 50; і ефект такий самий? Виглядає як сильне чаклунство.

Union -и (об'єднання) використовують в двох випадках:

Для створення «універсального» типу даних. здатного зберігати не єдиний, а один з зумовлених типів. Для цього до об'єднання додають целочисленное поле, яке вказує тип збережених зараз даних:

Один із прикладів подібного застосування в реальному житті - структура VARIANT з Windows API.

Іншими словами, це попередник сучасних boost :: variant. QVariant і т. Д. Однак перераховані вище класи можуть зберігати в собі непрімітівние типи (з конструкторами, деструкторами і операторами копіювання), а union - немає.

Для перетворення між несумісними типами. Традиційно для цих цілей використовують оператор перетворення (T). або reinterpret_cast<>. Однак ці способи небезпечні порушенням strict aliasing rule і, як результат, породженням невизначеного (тобто непередбачуваного) поведінки.

Правильні способи перетворення - це або memcpy (подібний виклик якого викидається компілятором), або використання union -а.

UPD: Увага! Перетворення через union є допустимим тільки в Сі. але не в C ++. У відповіді на питання «Accessing inactive union member and undefined behavior?» Наводяться відсилання на наступні пункти стандартів:

6.5.2.3 Структури і члени об'єднань

95) Якщо поле, яке використовується для читання вмісту об'єкта-об'єднання, не є полем, використаним раніше для запису значення в цей об'єкт, необхідна частина внутрішнього подання об'єкта інтерпретується в відповідністю з поданням затребуваного типу згідно 6.2.6 (даний процес відомий також як type punning ). Це уявлення може призводити до невизначеного поведінки.

6.5.2.3 Structure and union members

95) If the member used to read the contents of a union object is not the same as the member last used to store a value in the object, the appropriate part of the object representation of the value is reinterpreted as an object representation in the new type as described in 6.2.6 (a process sometimes called '' type punning ''). This might be a trap representation.

c ++ 11 (немає явного дозволу type punning-а)

В об'єднанні в кожен момент часу може бути активно тільки одне нестатичних поле; внаслідок цього в об'єднанні в будь-який момент часу може знаходитися не більше одного значення.

In a union, at most one of the non-static data members can be active at any time, that is, the value of at most one of the non-static data members can be stored in a union at any time.

Схожі статті