Preambolo per persone con microottimizzatore
Ricorda:
"I programmatori sprecano enormi quantità di tempo pensando o preoccupandosi della velocità delle parti non critiche dei loro programmi e questi tentativi di efficienza hanno effettivamente un forte impatto negativo quando si considerano il debug e la manutenzione. Dovremmo dimenticare piccole efficienze, diciamo Il 97% delle volte: l'ottimizzazione prematura è la radice di tutti i mali. Eppure non dovremmo rinunciare alle nostre opportunità in quel 3% critico ".
(Grazie alla metamorfosi per la citazione completa)
Non usare un array C invece di un vettore (o qualsiasi altra cosa) solo perché ritieni che sia più veloce in quanto dovrebbe essere di livello inferiore. Ti sbaglieresti.
Usa di default il vettore (o il contenitore sicuro adattato alle tue necessità), quindi se il tuo profiler dice che è un problema, vedi se puoi ottimizzarlo, usando un algoritmo migliore o cambiando contenitore.
Detto questo, possiamo tornare alla domanda originale.
Matrice statica / dinamica?
Le classi di array C ++ si comportano meglio dell'array C di basso livello perché sanno molto di se stesse e possono rispondere alle domande che gli array C non possono fare. Sono in grado di pulire dopo se stessi. E, cosa ancora più importante, di solito sono scritti usando template e / o inline, il che significa che ciò che appare a un sacco di codice nel debug si risolve in un codice scarso o nullo prodotto nella build del rilascio, il che significa nessuna differenza con la loro concorrenza meno sicura integrata.
Tutto sommato, rientra in due categorie:
Matrici dinamiche
L'uso di un puntatore a un array malloc-ed / new-ed sarà nella migliore delle ipotesi veloce come la versione std :: vector e molto meno sicuro (vedi il post di litb ).
Quindi usa uno std :: vector.
Matrici statiche
L'uso di un array statico sarà nella migliore delle ipotesi:
Quindi usa uno std :: array .
Memoria non inizializzata
A volte, l'utilizzo vector
di un buffer invece di un raw comporta un costo visibile perché vector
inizializzerà il buffer in fase di costruzione, mentre il codice che sostituisce non lo ha fatto, come ha osservato Bernie nella sua risposta .
Se questo è il caso, puoi gestirlo usando un unique_ptr
invece di un vector
o, se il caso non è eccezionale nella tua codeline, scrivi effettivamente una classe buffer_owner
che sarà proprietaria di quella memoria e ti darà un accesso facile e sicuro ad essa, incluso bonus come ridimensionarlo (usando realloc
?) o qualunque cosa ti serva.