Unioni
Un costrutto sotto certi aspetti simile alle strutture e quello delle unioni.
Sintatticamente l'unica differenza e` che nella dichiarazione di una unione
viene utilizzata la keyword union anzicche` struct:
union TipoUnione {
unsigned Intero;
char Lettera;
char Stringa[500];
};
Come per i tipi struttura, la selezione di un dato campo di una variabile di
tipo unione viene eseguita tramite l'operatore di selezione .
(punto).
Vi e` tuttavia una profonda differenza tra il comportamento di una struttura
e quello di una unione: in una struttura i vari campi vengono memorizzati in
indirizzi diversi e non si sovrappongono mai, in una unione invece tutti i campi
vengono memorizzati a partire dallo stesso indirizzo. Cio` vuol dire che, mentre
la quantita` di memoria occupata da una struttura e` data dalla somma delle
quantita` di memoria utilizzata dalle singole componenti, la quantita` di memoria
utilizzata da una unione e` data da quella della componente piu` grande (Stringa
nell'esempio precedente).
Dato che le componenti si sovrappongono, assegnare un valore ad una di esse
vuol dire distruggere i valori memorizzati accedendo all'unione tramite una
qualsiasi altra componente.
Le unioni vengono principalmente utilizzate per limitare l'uso di memoria memorizzando
negli stessi indirizzi oggetti diversi in tempi diversi. C'e` tuttavia un altro
possibile utilizzo delle unioni, eseguire "manualmente" alcune conversioni
di tipo. Tuttavia tale pratica e` assolutamente da evitare (almeno quando esiste
una alternativa) poiche` tali conversioni sono dipendenti dall'architettura
su cui si opera e pertanto non portabili, ma anche potenzialmete scorrette.
|