Il libro parla di ciò che è comunemente noto come bitfield, e il loro uso è spesso più efficiente in termini di memoria sulla maggior parte delle piattaforme, specialmente in contesti di serializzazione o comunicazione. Un booleano richiede che il proprio indirizzo sia utilizzabile dal compilatore. Ciò significa che, mentre, praticamente, abbiamo solo bisogno di un bit per rappresentare una condizione vera (1) o falsa (0), non esiste un modo fisico per indirizzare e memorizzare un bit in memoria. Questo spesso significa che un booleano occuperà un intero byte in memoria, proprio come il più piccolo intero su quella stessa piattaforma.
Ora diciamo che hai 18 variabili booleane. Ognuno avrà bisogno di un suo pezzo di memoria indirizzata in modo tale da poterlo fare riferimento altrove nel software. Ciò significa che nel nostro sistema teorico abbiamo bisogno di 18 byte. La gente ha iniziato a vedere questo come uno spreco di memoria, in quanto solo un bit di ogni byte era davvero necessario.
Inserisci bitfield. Se guardiamo un numero intero che corrisponde alla dimensione della memoria indirizzabile del sistema, vediamo che occupa lo stesso numero di bit di un singolo booleano. Gli integer utilizzano tutti i bit per rappresentare il suo intervallo di valori. (Il valore decimale 26 è rappresentato come 00000000 00000000 00000000 00011010 su un sistema a 32 bit, 3572 è 00000000 00000000 00001101 11110100, ecc.).
Gli operatori bit a bit ci permettono di giocare direttamente con quei bit, piuttosto che doversi preoccupare di qualsiasi valore intero reale che essi intendevano rappresentare. Questo è importante, perché se assegni dei significati in anticipo a ciascuno di questi bit, puoi impostarli su 1 e 0 in modo esplicito e trattare ciascun bit singolarmente come booleano.
Le persone amano stravolgere le analogie, ma ho intenzione di dargli uno scatto comunque:
Pensa a una strada di case in una zona ricca di scapoli. Ogni casa ha un indirizzo sulla strada, e ogni casa ha 32 stanze, ma solo una persona vive in ogni casa. Gli scapoli sono i nostri booleani. Ora diciamo che una famiglia si trasferisce in una delle case. Sono considerati una famiglia, ma ora ci sono molte più persone che vivono nella casa. Questo è come il nostro intero - mentre più persone ora occupano le stanze, lo vediamo ancora come una casa con un solo valore (la famiglia che vive lì). Ora un'altra casa viene convertita in appartamenti. Mentre fisicamente continua a occupare solo una casa per strada, assegniamo alcune lettere ad ogni stanza (Appartamento 1A, appartamento 2C, ecc.) Che non influenzano l'indirizzo fisico o la composizione della casa, ma facciamo riferimento a ciascuna persona individualmente - Questo è il campo di bit.
In pratica, considererei l'uso dei bitfield prima invece dei booleans come caso di pre-ottimizzazione. Ci sono dei compromessi nell'usabilità; qualcun altro può commentare i trade-off della velocità. Allo stesso modo, è possibile imbattersi in problemi che spostano le implementazioni del bitfield su sistemi diversi se non si presta attenzione (in che modo il valore a 32 bit dovrebbe apparire su un sistema a 8 bit?). Sul rovescio della medaglia, in un piccolo sistema incorporato su cui ho lavorato una tonnellata di valori booleani di stato su una connessione seriale lenta, la codifica come bitfield era fondamentalmente una necessità.