Diskuze: c++ struct vs union

C++ C a C++ c++ struct vs union

Avatar
pangas
Člen
Avatar
pangas:

Zdravím,
potřeboval bych, prosím, vysvětlit jednu drobnost. Jaký je přesně rozdíl mezi unií a strukturou? Četl jsem, že velikost vyhrazené paměti pro unii se odvozuje od největší složky unie. Jak je to ale možné? Velikost paměti, která je potřeba pro strukturu, je minimálně součet všech pamětí vyhrazených pro její složky, ale nerozumím nějak principu unie...
Díky

 
Odpovědět 24. května 23:38
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na pangas
Martin Dráb:

Struktura ti dovoluje sdružit určité položky, které spolu třeba nějak souvisejí, pod jeden název (jeden celek). Union se používá, pokud víš, že do dané oblasti je možné uložit více různých typů dat, ale platný je nejvýše jeden. Přitom klidně každá položka v unionu může být struktura.

Abych to nějak zjednodušil, dám příklad. Mám program (jmenuje se IRPMon, ale to je detail), který monitoruje komunikaci mezi aplikacemi a ovladači. Každý požadavek odeslaný na ovladač reprezentuje strukturou REQUEST_GENERAL. Požadavků ale může být více druhů s různou strukturou dat (běžný požadavek, rychlá komunikace, další speciální typy požadavků), přitom ale každý požadavek může být pouze jednoho typu. Takže REQUEST_GENERAL vypadá cca takto:

typedef struct {
  int RequestType;
  union {
  REQUEST_NORMAL NormalniPozadavek;
  REQUEST_FAST RychlaKomunikace;
  ...
  } Data;
} REQUEST_GENERAL;

Když uvidím požadavek v podobě mé struktury, podívám se do položky RequestType, která mi řekne, co je uloženo v unionu Data. Samozřejmě mi to nebrání hodnotu v RequestType ignorovat; je to spíš takový hezký přístup k datům.

A výhoda navíc je, že union šetří místo. Nikdo by mi nebránil tam union nemít a nahradit jej posloupností struktur. Ale proč to dělat, když vím, že požadavek může být jen jednoho typu (tzn. jen jedna z těch struktur by obsahovala validní data).

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +1 24. května 23:51
2 + 2 = 5 for extremely large values of 2
Avatar
David Novák
Tým ITnetwork
Avatar
Odpovídá na pangas
David Novák:

Jednoduše - v unii se položky překrývají -> můžeš použít jen jednu z nich.

Nahoru Odpovědět  +2 25. května 0:05
Chyba je mezi klávesnicí a židlí.
Avatar
pangas
Člen
Avatar
pangas:

Díky, už je to jasný.

 
Nahoru Odpovědět 25. května 11:19
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.