NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: c++ struct vs union

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
pangas
Člen
Avatar
pangas:24.5.2016 23:38

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.5.2016 23:38
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na pangas
Martin Dráb:24.5.2016 23:51

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í
+2,50 Kč
Řešení problému
Nahoru Odpovědět
24.5.2016 23:51
2 + 2 = 5 for extremely large values of 2
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na pangas
David Novák:25.5.2016 0:05

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

Nahoru Odpovědět
25.5.2016 0:05
Chyba je mezi klávesnicí a židlí.
Avatar
pangas
Člen
Avatar
pangas:25.5.2016 11:19

Díky, už je to jasný.

 
Nahoru Odpovědět
25.5.2016 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.