Unia (programowanie)
Z Wikipedii
Unia - typ danych w niektórych niskopoziomowych językach programowania, jak C, lub asembler, grupujący wiele różnych sposobów interpretacji tego samego fragmentu pamięci. Odpowiednikiem unii w języku Pascal jest rekord z wariantami.
Unia jest podobna do struktury, jednak wszystkie pola zajmują ten sam obszar pamięci.
Przykładowo unia:
union nazwa_unii { char tablica_znakowa[4]; int wartosc; } u;
tworzy zmienną u, do której można mieć dostęp albo jako do liczby (u.wartosc), albo jako do tablicy znaków (u.tablica_znakowa).
Tego typu manewry są czasem przydatne w niskopoziomowym programowaniu. Użycie unii nie jest jednak zalecane w innych wypadkach, gdyż jest wybitnie wrażliwe na różnice w reprezentacji poszczególnych typów w pamięci. Ten sam program, używający unii może zupełnie inaczej działać w zależności od tego, czy liczby są zapisywane jako big endian, czy little endian i jaką mają długość w bajtach:
u.wartosc=0x44434241;
W u.tablica_znakowa znalazł się napis:
- 'ABCD' w przypadku procesora Intel, kompilator 32-bitowy
- 'AB' w przypadku procesora Intel, kompilator 16-bitowy dla DOSu
- 'DCBA' w przypadku procesora Motorola,
[edytuj] Struktury jako pola unii
Elementami unii mogą być struktury, co czasem jest przydatne:
union liczba { struct { unsigned int a :8; unsigned int b :8; unsigned int c :8; unsigned int d :8; } rozbicie_na_bajty; struct { unsigned int a :16; unsigned int b :16; } rozbicie_na_slowa; unsigned int liczba; };
[edytuj] Unie anonimowe
C++ dopuszcza tzw unie anonimowe w których nie ma ani nazwy unii, ani nazwy zmiennej:
union { int liczba; char znak; };
Do pól takiej unii można dostawać się bezpośrednio używając ich nazw (np. liczba lub znak z przykładu powyżej). Czasem ten mechanizm jest stosowany przy umieszczaniu unii anonimowej jako pola struktury.