2013-01-17 18 views
30

È std :: array mobile?È std :: array mobile?

In Bjarne Native 2012 presentation slides (diapositiva 41) elenca std :: array come uno dei soli contenitori che non è mobile.

Un rapido sguardo sul codice gcc 4.8 librerie fonte sembra confermare che std :: array è non mobile:

std :: vector:

/* @brief %Vector move constructor. 
    ...  */ 
    vector(vector&& __x) noexcept 
    : _Base(std::move(__x)) { } 

mentre in std :: array di l'unico metodo che riceve un parametro di riferimento rvalue è l'accesso casuale elemento, che evita un ritorno copiando:

get(array<_Tp, _Nm>&& __arr) noexcept 
    { /*...*/ return std::move(get<_Int>(__arr)); } 

è la mossa costruttore & move-assignement per std :: array defaulted created, o è std :: array unmovable? Se è inamovibile, perché std :: array non può essere spostato mentre std :: vector può?

+0

Come punto di interesse, la presenza o l'assenza da sola di un costruttore di movimento non è sufficiente per stabilire che un tipo è o non è spostabile (se si utilizza la vista espressione/concetti sull'argomento, come la maggior parte Comune). Allo stesso modo per l'assegnazione del movimento. –

risposta

39

std::array è mobile solo se gli oggetti contenuti sono mobili.

std::array è molto diverso dagli altri contenitori perché l'oggetto contenitore contiene lo spazio di archiviazione, non solo i puntatori nell'heap. Lo spostamento di std::vector copia solo alcuni puntatori e gli oggetti contenuti non ne sono più saggi.

Sì, std::array utilizza il costruttore di spostamento di default e l'operatore di assegnazione. Come classe aggregata, non è consentito definire alcun costruttore.

+1

E il costruttore di spostamento predefinito per un array sposta ciascuno degli elementi? –

+9

@SethCarnegie Sposta-costruisce l'array membro, che sposta ciascuno dei suoi elementi. – Potatoswatter

+3

Grazie! Quindi un'operazione di spostamento in un array std :: è O (n), poiché lo spostamento si verifica in realtà sui suoi elementi, mentre in un vettore std sarebbe O (1)? (poiché nel caso std :: vector solo il puntatore deve essere spostato) –

Problemi correlati