I bit field (bit fields) in C sono membri di una struttura che occupano un numero definito di bit invece delle dimensioni standard del tipo. Consentono di risparmiare memoria, specialmente per memorizzare flag e insiemi di stati compatti.
Dichiarazione:
struct Flags { unsigned int enable : 1; unsigned int mode : 2; unsigned int code : 5; };
In questo esempio, la struttura occupa almeno 8 bit, anziché 3 * sizeof(unsigned int).
Dove applicarli:
Limitazioni e punti critici:
Esempio:
struct Packet { unsigned char start : 1; unsigned char id : 3; unsigned char flag : 4; };
Domanda: È possibile utilizzare il tipo char o signed int per i bit field?
Risposta: Lo standard C consente di utilizzare int, unsigned int e (attraverso estensioni dei compilatori) altri tipi interi standard (char, short). Tuttavia, la portabilità è garantita solo per int e unsigned int.
Esempio di errore:
struct Example { signed char a : 3; }; // Su diversi compilatori/architetture ci sono diverse regole di memorizzazione del segno e ordine dei bit.
Storia
Durante l'integrazione del software su ARM e x86 si è scoperto che una struttura con bit field veniva decompattata in modo diverso: diverso ordine dei bit e allineamento. È stata progettata senza tenere conto di queste differenze, portando all'impossibilità di leggere i dati in un ambiente multipiattaforma.
Storia
Nel sistema di controllo dei controller del motore, nel bit field della struttura è stato erroneamente utilizzato il tipo
char. Su alcuni processori ARM questo comportava un'imprecisa estensione del segno, che portava a un'elaborazione errata dei flag.
Storia
In un protocollo di rete sono stati utilizzati bit field per imballare i flag del messaggio; non si è tenuto conto del fatto che i campi più significativi non inizializzati rimangono sporchi. Durante la trasmissione tra dispositivi si sono verificati errori casuali di stato a causa delle differenze nell'inizializzazione.