2016-07-11 75 views
7

Nel documentation, posso vedere che std::vector<bool> è ottimizzato per l'efficienza di spazio rendendo ogni booleano occupare un singolo bit. Dalla documentazione:std :: vector <bool> implementazione ottimizzazione

Il modo in cui std :: vector è reso efficiente in termini di spazio (oltre che se è ottimizzato del tutto) è definito dall'implementazione.

Ciò significa che dipende dall'implementazione del compilatore? Se sì, dove posso controllare se il mio compilatore lo supporta? Perché non lo vogliono supportato? Sembra un'implementazione davvero semplice ed efficiente.

In caso negativo, cosa significa e cosa implica se desidero che venga eseguita questa ottimizzazione?

Sto usando il set di strumenti GCC TDM.

+1

Sì, significa che l'implementazione di 'std :: vector ' dipende in gran parte dal compilatore. Potrebbe non essere affatto ottimizzato, o potrebbe essere ottimizzato in modo specifico per l'implementazione. Generalmente lo trovi consultando la documentazione per il tuo compilatore. Con GCC e altri toolchain open source, suppongo che potresti anche consultare il codice sorgente. Ma questo non solo richiede più lavoro, potrebbe non essere una buona idea, dal momento che il codice sorgente documenta solo l'implementazione, non il contratto. –

+1

Un modo semplice per verificare se viene fornita tale ottimizzazione è verificare se 'std :: vector :: reference_type' è' bool & 'o qualcos'altro. In quest'ultimo caso, hai un tipo di proxy, che dovrebbe essere consentito solo per l'implementazione "ottimizzata". –

+1

@MatteoItalia 'std :: vector :: reference' è necessario per essere un proxy anche se l'implementazione non contiene effettivamente i bit. –

risposta

2

La definizione del linguaggio formale non vuole escludere implementazioni ragionevoli, quindi devono sempre essere un po 'attenti.

Ad esempio, una tipica build di debug è ancora conforme agli standard, ma potrei benissimo vedere un vector<bool> non compresso in modalità di debug.

Ora questo non è non specificato ma definito dall'implementazione. Ciò significa che il fatto che sia compresso dovrebbe essere contenuto nella documentazione dei compilatori da qualche parte, ma lo standard non descrive come dovrebbe essere organizzata la documentazione.

Se il compilatore non lo supporta come desideri, puoi semplicemente usare un'altra libreria (Boost è il candidato più ovvio). vector<bool> in genere non è una classe che dipende dalla profonda magia del compilatore, quindi le alternative sono facili da scrivere.

0

È dipendente dall'implementazione e non portatile. Sembra avere alcuni difetti di progettazione, e dovresti evitare di usare vector<bool>. Puoi ottenere maggiori dettagli da "Effective STL, item 18" di Meyers.

Se davvero ci si preoccupa dell'efficienza dello spazio, è possibile utilizzare std::bitset.

+0

Purtroppo non posso usare 'std :: bitset' perché ho bisogno di inizializzazione dinamica. – Simon

+3

FWIW, Boost ha un [dynamic_bitset] (http://www.boost.org/doc/libs/1_61_0/libs/dynamic_bitset/dynamic_bitset.html), ma a volte Boost potrebbe essere eccessivo. Se sapete come usarlo, 'std :: vector ' non è poi così male, come [qualcuno sottolinea] (https://isocpp.org/blog/2012/11/on-vectorbool). – legends2k

3

L'implementazione definita significa che dipende da cosa costituisce i parametri della macchina astratta. (I.E., gli algoritmi che definiscono il sistema operativo host, le specifiche di implementazione e le chiamate di sistema). Un Q informativo & A su ciò che "l'attuazione definito” il mezzo è here.

Più che probabile, se si dispone di una macchina moderna con un moderno compilatore/IDE, supporta la definizione attuazione.

Se un compilatore doesn' t supportarlo, non è probabile perché non lo "vogliono", ma perché o è un compilatore molto vecchio, o una macchina con molte risorse.

Si riduce al suo dipendente dalla macchina, così diversi sistemi operativi gestirà a suo piacimento (ad esempio, 32-bit vs 64-bit, ecc.) Non ha effetto sulla portabilità, a meno che non funzioni con una compilation (molto più vecchia) ER. Puoi controllare le specifiche della versione del compilatore se è un problema, che è facilmente reperibile online cercando il tuo compilatore e la sua versione.

Problemi correlati