2013-04-04 7 views
8

Sto usando memcpy per copiare il contenuto di std: vettori <> per primitve array. Per i tipi di dati come int, float, double etc. ha funzionato bene. Quando ho iniziato a copiare un boolvector ho riscontrato un problema, ovvero ho ottenuto strani valori.Perché la dimensione di "std :: vector <bool>" 16 Byte?

Prima ho iniziato a fare un uscita di test per un vettore float:

std::vector<float> test1 (3,0); 

cout << "Sizeof test1[0] : " << sizeof(test1[0]) << endl 
    << "Memoryaddress 0: " << &test1[0] << endl 
    << "Memoryaddress 1: " << &test1[1] << endl 
    << "Memoryaddress 2: " << &test1[2] << endl; 

L'output è:

Sizeof test1[0]: 4 
Memoryaddress 0: 02793820 
Memoryaddress 1: 02793824 
Memoryaddress 2: 02793828 

e questo è quello che mi aspetto. La dimensione float è 4 byte e la distanza dal valore float successivo è 4 byte. Quando faccio questo per bool l'output è simile al seguente:

std::vector<bool> test (3,0); 

cout << "Sizeof test[0]: " << sizeof(test[0]) << endl 
    << "Memoryaddress 0: " << &test[0] << endl 
    << "Memoryaddress 1: " << &test[1] << endl 
    << "Memoryaddress 2: " << &test[2] << endl; 

L'output è:

Sizeof test[0]: 16 
Memoryaddress 0: 011EF94C 
Memoryaddress 1: 011EF93C 
Memoryaddress 2: 011EF92C 

Perché le dimensioni dei bool 16 byte? Sembra un totale esagerazione per me. Ci sono spiegazioni per questo?

+1

'& test [0]' non è quello che pensi che sia. Controlla il suo tipo! –

+2

Il titolo è fuorviante, non si controlla mai effettivamente la dimensione di 'std :: vector '. – jrok

+0

Non puoi prendere il valore 'sizeof' che è più piccolo di un carattere. L'operatore 'sizeof' restituisce la dimensione in multipli interi della dimensione di un carattere. –

risposta

18

differenza di altre specializzazioni vector, vector<bool> non gestisce un array dinamico di bool oggetti. Invece, dovrebbe contenere i valori booleani in un singolo bit ciascuno.

Poiché i singoli bit non sono indirizzabili, test[0] non può essere semplicemente un riferimento a bool. Invece, è un tipo di classe vector<bool>::reference che può essere convertito in bool (per ottenere il valore) e assegnato da bool (per modificare l'elemento vettore).

Ciò significa che vector<bool> non soddisfa completamente i requisiti di un contenitore standard e non può essere utilizzato se sono necessari riferimenti o puntatori ai suoi elementi. Se si richiede un contenitore "reale" con elementi indirizzabili, considerare invece vector<char> o deque<bool>.

+0

Grazie. Il tuo anser è chiaro e comprensibile! – akristmann

+1

@akristmann Puoi anche dare un'occhiata a http://en.cppreference.com/w/cpp/utility/bitset che * potrebbe * essere adatto a te. –

4

std::vector<bool> è una versione specializzata del vettore, ottimizzata per lo spazio.

  • La memoria non è necessariamente una matrice di valori bool, ma l'implementazione della libreria può ottimizzare la memoria in modo che ogni valore sia memorizzato in un singolo bit.
  • Gli elementi non vengono creati utilizzando l'oggetto allocator, ma il loro valore viene impostato direttamente sul bit corretto nella memoria interna.

Ulteriori informazioni: http://www.cplusplus.com/reference/vector/vector-bool/