2015-05-15 17 views
14

Se voglio costruire un semplice array comestd :: array di vs prestazioni dell'array

int myArray[3] = {1,2,3}; 

Dovrei usare std::array invece?

std::array<int, 3> a = {{1, 2, 3}}; 

Quali sono i vantaggi dell'utilizzo di std :: array rispetto a quelli usuali? È più performante? Semplicemente più facile da gestire per la copia/l'accesso?

+1

Definizione di array multidimensionale con std :: sarà difficile – goGud

+5

@goGud: non difficile, solo più dettagliato. –

risposta

25

Quali sono i vantaggi dell'utilizzo di std::array rispetto a quelli abituali?

Ha una semantica del valore amichevole, in modo che possa essere passata o restituita da funzioni in base al valore. La sua interfaccia rende più comodo trovare la dimensione e utilizzare con algoritmi basati su iteratori in stile STL.

È più performante?

Dovrebbe essere esattamente lo stesso. Per definizione, è un semplice aggregato contenente un array come unico membro.

Semplicemente più semplice da gestire per la copia/l'accesso?

Sì.

5

std::array è progettato come wrapper zero-overhead per i C array che gli conferisce il valore "normale" come semantica degli altri contenitori C++.

Non dovresti notare alcuna differenza nelle prestazioni di runtime mentre continui a goderti le funzionalità extra.

Utilizzareinvece di int[] gli array di stile è una buona idea se si dispone di C++ 11 o di boost.

1

std::array ha semantica del valore mentre gli array grezzi no. Ciò significa che è possibile copiare std::array e trattarlo come un valore primitivo. Puoi riceverli per valore o riferimento come argomenti di funzione e puoi restituirli per valore.

Se non si copia mai un std::array, non c'è differenza di prestazioni rispetto a un array raw. Se hai bisogno di fare copie allora std::array farà la cosa giusta e dovrebbe comunque dare prestazioni uguali.

10

Un std::array è un involucro molto sottile intorno una matrice C-stile, fondamentalmente definita come

template<typename T, size_t N> 
class array 
{ 
public: 
    T _data[N]; 
    T& operator[](size_t); 
    const T& operator[](size_t) const; 
    // other member functions and typedefs 
}; 

È un aggregate, e consente di utilizzare quasi come un tipo fondamentale (cioè si può passare -by-value, assegna ecc, mentre un array C standard non può essere assegnato o copiato direttamente su un altro array). Dovresti dare un'occhiata ad alcune implementazioni standard (vai alla definizione dal tuo IDE preferito o apri direttamente <array>), è un pezzo della libreria standard C++ che è abbastanza facile da leggere e capire.