2011-11-01 26 views
6

test di boolea;Come viene memorizzata una variabile di tipo bool in memoria? (C++)

sizeof(test) = 1 se si utilizza VS 2010. Poiché ogni tipo di dati C++ deve essere indirizzabile, la variabile bool "test" è 8 bit (1 byte).

La mia domanda è che la variabile "test" occupa davvero 1 byte in memoria?

Esiste qualche abilità di implementazione che può rendere il tipo di dati bool occupare solo un bit? Se sì, puoi darmi un esempio?

bool test1[32] (in VS 2010), int test2 (in VS 2010)

fare test1 e test2 occupano la stessa memoria?

+0

vorrei sottolineare che potrebbe essere ragionevole per una piattaforma per memorizzare un valore booleano in 4 byte su un 32- bit machine quando iper-ottimizzazione per la velocità. Quindi se avessi 4 booleani in una struttura, avresti solo bisogno di una singola operazione ALU per verificare se un bool è vero, rispetto a due quando ci sono molti booleani confezionati in una parola macchina. (Di solito una piccola differenza non è affatto importante.) – Kos

+0

Alcuni processori incorporati hanno effettivamente una memoria bitable indirizzabile, in modo che la variabile bool possa occupare un bit. –

risposta

8

Ogni elemento di test1 deve essere indirizzabile. Ciò implica che test1 richiede almeno 32 byte (e non bit).

Se si desidera più valori booleani per essere memorizzati in una singola variabile, utilizzare std::bitset o std::vector<bool> (ma essere consapevoli che quest'ultimo non è in realtà un vettore di Caccio, è una specializzazione progettato per risparmiare spazio).

IIRC, C++ 11 definisce anche std::dynamic_bitset.

+3

significa probabilmente 32 bit, non byte – Milan

+1

Se il processore ha unità indirizzabili a 8 bit, ciò implicherebbe che un 'bool' deve occupare 1 ottetto (byte), non 4 (32 bit). E sì, ci sono ancora sistemi indirizzabili a 8 bit. L'ARM9 può accedere a valori a 8 o 32 bit. –

+2

@ entity64: 'test1' è una matrice di 32 oggetti' bool' indirizzabili, che avranno bisogno (almeno) di 32 byte, uno per oggetto. –

3

La mia domanda è che la variabile "test" occupa davvero 1 byte in memoria?

Sì, se sizeof(bool)==1. Fondamentalmente, la dimensione di bool è definita dall'implementazione, il che significa che potrebbe essere maggiore di 1 byte per un determinato compilatore.

bool test1 [32] (in VS 2010), int test2 (in VS 2010)
test1 test2 fa e occupano la stessa memoria?

Ciò che ciascuno di essi occupa può essere conosciuto utilizzando l'operatore sizeof. Ecco a cosa serve la dimensione dell'operatore. Quindi test1 e test2 occuperanno rispettivamente sizeof(test1) e sizeof(test2)byte.

2

Un'altra possibilità di avere una variabile di 1 bit, è quello di mettere in una struct bitfield:

struct { 
    int a:1; 
    int b:1; 
}; 
+0

non dovrebbe essere 'unsigned a: 1'? – Xeo

+0

Beh, sono sicuro che l'ho usato in questo modo, anche se non l'ho mai considerato come un intero con segno a 1 bit, quindi hai un punto qui. –

Problemi correlati