De ce avem nevoie de unirea (uniune) deversorul stivă în limba rusă
Toate acestea sunt păstrate amestecat în aceeași zonă de depozitare. Ce rost, pentru că odată ce setați valori
Ea nu a venit să-i înapoi - toate se amestecă în sus? Mod de a salva câțiva octeți sau câteva cicluri menținând în același timp lizibilitatea? Nu scrie 4 funcții diferite, și scrie una, care ia Uniunii și trebuie să decidă ce să facă? În acest caz, nu mai ușor să ia vidul * și apoi să arunce în tipul, ceea ce este necesar? Ca un exemplu de „Just a aruncat o“ aduce codul de mai jos:
funcția de imprimantă poate fi scris ceva de genul:
Din nou, ceea ce este punctul dacă pot face mai întâi o variabilă int separată a = 20; și apoi modificați valoarea a = 50; iar efectul este exact la fel? Se pare ca o magie puternică.
Uniunea s (asociație) este utilizat în două cazuri:
Pentru a crea un „universal“ tip de date. capabil de a stoca nu numai ca unul dintre tipurile predefinite. În acest scop, unirea a adăugat câmp întreg care indică tipul de date stocate în acest moment:
Un exemplu de o astfel de cerere în viața reală - structura VARIANT a API-ului Windows.
Cu alte cuvinte, acesta este predecesorul boost :: varianta de azi. .. QVariant, etc Cu toate acestea, clasele de mai sus se pot stoca un tip non-primitive (cu constructori, destructori, și operatorii de copiere), și uniunea - nr.
Pentru a converti între tipuri incompatibile. În mod tradițional, operatorul utilizează transformarea (T) în acest scop. sau reinterpret_cast<>. Cu toate acestea, aceste metode sunt periculoase încălcare a regulii stricte aliasing și, ca urmare, produsul de comportament nedeterminat (adică imprevizibil).
Metodele de conversie corectă - fie memcpy (o astfel de apel, care este aruncat de compilator) sau utilizarea uniunii specificate.
UPD: Atenție! Transformarea prin unirea este valabilă numai în C. dar nu în C ++. Ca răspuns la întrebarea «? Accesarea membru al Uniunii inactiv și comportament nedefinit» sunt referiri la următoarele elemente standarde:
6.5.2.3 Structura și asociere membri
95) În cazul în care câmpul este utilizat pentru a citi conținutul obiectului-asociației, nu un câmp, utilizat anterior pentru scrierea valorilor în acest loc, porțiunea necesară reprezentării interne a obiectului este interpretat în conformitate cu tipul cerut de reprezentare în conformitate cu 6.2.6 (acest proces este cunoscut sub numele de tip joc de cuvinte ). Acest punct de vedere poate duce la un comportament nedefinit.
6.5.2.3 Structura și membrii de sindicat
95) În cazul în care membrul utilizat pentru a citi conținutul unui obiect unire nu este același ca membru ultimul utilizat pentru a stoca o valoare în obiectul, partea corespunzătoare a reprezentării obiect al valorii este reinterpretat ca o reprezentare obiect în noul tipul descris în 6.2.6 (proces denumit uneori „“ tip joc de cuvinte „“). Acest lucru ar putea fi o reprezentare capcană.
C ++ 11 (nu există nici un tip explicit permisiunea de a-un joc de cuvinte)
Asocierea la un moment dat poate fi activ un singur domeniu non-static; prin urmare, să se combine la un moment dat poate fi nu mai mult de o valoare.
Într-o uniune, cel mult unul dintre membrii de date non-statice pot fi active în orice moment, adică, valoarea de cel mult unul dintre membrii de date non-statice pot fi stocate într-o uniune în orice moment.