Risposte:
Perché la CPU non può indirizzare nulla di più piccolo di un byte.
bt
, bts
, btr
e btc
possono indirizzare singoli bit!
bt
indirizzi un offset di byte e quindi testa il bit a un dato offset, indipendentemente, quando si specifica un indirizzo si va in byte ... i valori letterali di offset dei bit diventerebbero un po 'prolissi (scusate il gioco di parole).
Da Wikipedia :
Storicamente, un byte era il numero di bit utilizzati per codificare un singolo carattere di testo in un computer ed è per questo motivo l'elemento indirizzabile di base in molte architetture di computer.
Quindi il byte è l' unità indirizzabile di base , al di sotto della quale l'architettura del computer non può indirizzarsi. E poiché (probabilmente) non esistono computer che supportano byte a 4 bit, non hai 4 bit bool
ecc.
Tuttavia, se puoi progettare un'architettura di questo tipo che può indirizzare 4 bit come unità indirizzabile di base, allora avrai una bool
dimensione di 4 bit solo su quel computer!
int
e char
dal mio post.
bool
, perché char
è la più piccola unità indirizzabile in C ++ , indipendentemente da ciò che l'architettura può affrontare con i propri codici operativi. sizeof(bool)
deve avere un valore di almeno 1 e gli bool
oggetti adiacenti devono avere i propri indirizzi in C ++ , quindi l'implementazione deve solo renderli più grandi e sprecare memoria. Ecco perché i campi di bit esistono come un caso speciale: i membri del campo di bit di una struttura non devono essere indirizzati separatamente, quindi possono essere più piccoli di a char
(sebbene l'intera struttura non possa ancora esserlo).
char
è la più piccola unità indirizzabile in C ++?
sizeof(bool)
non può essere 0,5 :-) Suppongo che un'implementazione possa fornire legalmente puntatori a subbyte come estensione, ma oggetti "ordinari" come bool, allocati in modi ordinari, devono fare ciò che dice lo standard.
La risposta più semplice è; è perché la CPU indirizza la memoria in byte e non in bit, e le operazioni bit per bit sono molto lente.
Tuttavia è possibile utilizzare l'allocazione della dimensione dei bit in C ++. C'è la specializzazione std :: vector per i vettori di bit e anche le strutture che accettano voci di dimensioni di bit.
Ai vecchi tempi, quando dovevo andare a scuola a piedi in una violenta tormenta, in salita in entrambe le direzioni, e il pranzo era qualsiasi animale che potessimo rintracciare nei boschi dietro la scuola e uccidere a mani nude, i computer avevano molta meno memoria disponibile di oggi. Il primo computer che ho mai usato aveva 6K di RAM. Non 6 megabyte, non 6 gigabyte, 6 kilobyte. In quell'ambiente, aveva molto senso impacchettare quanti più booleani possibile in un int, quindi usavamo regolarmente le operazioni per estrarli e inserirli.
Oggi, quando le persone ti derideranno per avere solo 1 GB di RAM, e l'unico posto in cui potresti trovare un disco rigido con meno di 200 GB è un negozio di antiquariato, non vale la pena mettere in valigia i bit.
È possibile utilizzare i campi bit per ottenere numeri interi di dimensioni inferiori.
struct X
{
int val:4; // 4 bit int.
};
Anche se di solito viene utilizzato per mappare le strutture in base ai modelli di bit previsti dall'hardware:
struct SomThing // 1 byte value (on a system where 8 bits is a byte
{
int p1:4; // 4 bit field
int p2:3; // 3 bit field
int p3:1; // 1 bit
};
Potresti avere bool a 1 bit e int a 4 e 2 bit. Ma ciò renderebbe un set di istruzioni strano per nessun miglioramento delle prestazioni perché è un modo innaturale di guardare l'architettura. In realtà ha senso "sprecare" una parte migliore di un byte piuttosto che cercare di recuperare i dati inutilizzati.
L'unica app che si preoccupa di impacchettare diversi bool in un singolo byte, nella mia esperienza, è Sql Server.
bool
può essere un byte - la dimensione indirizzabile più piccola della CPU, o può essere maggiore. Non è insolito avere bool
le dimensioni di int
per scopi di prestazione. Se per scopi specifici (ad esempio simulazione hardware) hai bisogno di un tipo con N bit, puoi trovare una libreria per quello (ad esempio la libreria GBL ha una BitSet<N>
classe). Se sei preoccupato per la dimensione di bool
(probabilmente hai un grande contenitore), puoi impacchettare i bit da solo, o usare std::vector<bool>
quello lo farà per te (fai attenzione a quest'ultimo, poiché non soddisfa i requisiti del contenitore).
Perché in generale, la CPU alloca la memoria con 1 byte come unità di base, sebbene alcune CPU come MIPS utilizzino una parola di 4 byte.
Tuttavia si vector
occupa bool
in modo speciale, con vector<bool>
un bit per ogni bool viene assegnato.
lw
/ sw
sono molto più usate.
Il byte è l'unità più piccola di archiviazione dei dati digitali di un computer. In un computer la RAM ha milioni di byte e ognuno di loro ha un indirizzo. Se avesse un indirizzo per ogni bit, un computer potrebbe gestire 8 volte meno RAM di quanto può.
Maggiori informazioni: Wikipedia
Anche quando la dimensione minima possibile è 1 Byte, puoi avere 8 bit di informazioni booleane su 1 Byte:
http://en.wikipedia.org/wiki/Bit_array
Il linguaggio Julia ha BitArray, ad esempio, e ho letto delle implementazioni C ++.
struct Packed { unsigned int flag1 : 1; unsigned int flag2: 1; };
. La maggior parte dei compilatori assegnerà un fullunsigned int
, tuttavia si occupano da soli dei bit-twiddling quando leggi / scrivi. Inoltre si occupano da soli delle operazioni modulo. Questo è ununsigned small : 4
attributo che ha un valore compreso tra 0 e 15, e quando dovrebbe arrivare a 16, non sovrascriverà il bit precedente :)