Защо имаме нужда от обединение (съюз) стека преливане на Руски
Всичко това се съхранява в смесен едно и също място. Какъв е смисълът, защото след като се определят стойности
Той не е дошъл, за да ги получите обратно - всичко микс нагоре? Начин да се спестят няколко байта или няколко цикъла при запазване четливост? Не пишете с 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 (няма изрично разрешение тип редуване на думи, а)
Асоциацията по всяко време може да бъде активен само един не-статичен област; като по този начин да се съчетаят във всеки един момент може да бъде не повече от една стойност.
В един съюз, най-много един от членовете на които не са статични данни може да бъде активен по всяко време, което означава, че стойността на най-много един от членовете на които не са статични данни да се съхраняват в един съюз по всяко време.