Защо имаме нужда от обединение (съюз) стека преливане на Руски

Всичко това се съхранява в смесен едно и също място. Какъв е смисълът, защото след като се определят стойности

Той не е дошъл, за да ги получите обратно - всичко микс нагоре? Начин да се спестят няколко байта или няколко цикъла при запазване четливост? Не пишете с 4 различни функции, и пишат едно, което отнема на Съюза и трябва да решим какво да правим? В този случай, за да не се вземат по-лесно празнотата * и след това да се хвърли в типа, което е необходимо? Като пример за "Просто хвърли" донесе следния код:

Функцията на принтера може да се запише по следния начин:

Отново, какъв е смисълът, ако мога да направя първи отделна променлива вътр а = 20; и след това промените стойност А = 50; и ефектът е точно същото? Тя изглежда като силна магия.

Съюз и (сдружение) се използва в два случая:

За да се създаде "универсална" тип данни. възможност за съхраняване не само като един от предварително определени видове. За тази цел Съюзът добавя число поле показващо вида на съхраняваните данни в момента:

Един пример за такова приложение в реалния живот - ВАРИАНТ структура на API на Windows.

С други думи, това е предшественик на днешния тласък :: вариант. .. QVariant и т.н. Въпреки това, по-горе класове могат да съхраняват не-примитивни видове (с конструктори, деструктори, както и операторите на копиране), както и обединение - не.

За да конвертирате между несъвместими видове. Традиционно, операторът използва трансформацията (Т) за тази цел. или reinterpret_cast<>. Въпреки това, тези методи са опасно нарушение на стриктно правилото за заглаждане и, като резултат, продукт на безсрочен (т.е., непредсказуема) поведение.

Правилните методи за преобразуване - или memcpy (като повикване който се изхвърля от компилатора) или използването на съюз посочено.

UPD: Внимание! Трансформация чрез обединението е валиден само в C. но не и в C ++. В отговор на въпрос «? Достъп до неактивен член на съюза и неопределено поведение» са споменавания на следните стандарти елементи:

6.5.2.3 Структура и асоцииране членове

95) Ако полето се използва за четене на съдържанието на обект-асоциация, а не област, използвани преди това за записване на стойностите на това място, необходимата част на вътрешния представяне на обекта се тълкува в съответствие с искания вида на представяне съгласно 6.2.6 (този процес е известен като тип редуване на думи ). Тази гледна точка може да доведе до неопределено поведение.

6.5.2.3 Структура и синдикалните членове

95) Ако членът използва, за да се запознае със съдържанието на обект съюз не е същото като членът миналата използва за съхраняване на стойност в обекта, съответната част от представителството обект на стойността се интерпретира като представителство обект в новите типа, описан в 6.2.6 (процес понякога се нарича "" тип редуване на думи ""). Това може да бъде представителство капан.

C ++ 11 (няма изрично разрешение тип редуване на думи, а)

Асоциацията по всяко време може да бъде активен само един не-статичен област; като по този начин да се съчетаят във всеки един момент може да бъде не повече от една стойност.

В един съюз, най-много един от членовете на които не са статични данни може да бъде активен по всяко време, което означава, че стойността на най-много един от членовете на които не са статични данни да се съхраняват в един съюз по всяко време.