2015-02-27 13 views
8

ho letto un paio di messaggi su come restituire un vettore da un metodo comprendono questi:Come restituire un vettore membro della classe in C++ 11

  1. c11 rvalues and move semantics confusion return statement

  2. want speed pass by value

  3. why does visual studio not perform return value optimization rvo

  4. Wiki - Return Value Optimization

e sto ancora confuso su come passare un vettore nel modo giusto in VS2013 e quali sono le differenze tra i metodi riportati di questo codice (le domande sono contrassegnati nei commenti):

class Foo{ 
private: 
    std::vector<int> vect; 

public: 
    //1 - classic way? 
    void GetVect(std::vector<int>& v) 
     { 
     v = vect;// assignment with swap? 
     } 

    //2 - RVO? 
    std::vector<int> GetVect() 
     { 
     return vect; 
     } 

    //3 - RVO with const? 
    std::vector<int> GetVect() const 
     { 
     return vect; 
     } 

    //4 - just move? 
    std::vector<int> GetVect() 
     { 
     return std::move(vect); 
     } 

    //5 - move with {}? 
    std::vector<int> GetVect() 
     { 
     return { std::move(vect) }; 
     } 
} 

Quindi non sono sicuro che // 1 sia una forma esplicita di // 2, non sono sicuro che 3 funzioni. Quali sono le differenze tra 4 e 5? Come testarlo se RVO lavora per vettori in VS2013?

+2

Sono confuso. Perché sei preoccupato di copiare elision e spostarti quando il tuo 'GetVect()' implica che si tratta di una funzione getter? –

+2

Does 'Foo' è il vettore? 'GetVec' dovrebbe consentire l'accesso in sola lettura al vettore? Dovrebbe permettere di scrivere sul vettore? Dovrebbe trasferire la proprietà? Le risposte a queste domande sono importanti per progettare correttamente la classe. – MadScientist

+2

Vuoi semplicemente esporre il reale 'std :: vector' oi suoi valori? Cioè è importante per te passare per riferimento? – Mario

risposta

8
//1 - classic way? 
void GetVect(std::vector<int>& v) 
    { 
    v = vect;// assignment with swap? 
    } 

Questo è semplicemente brutto, hai ancora bisogno di una copia e rendi la tua interfaccia troppo complessa.

//2 - RVO? 
std::vector<int> GetVect() 
    { 
    return vect; 
    } 

//3 - RVO with const? 
std::vector<int> GetVect() const 
    { 
    return vect; 
    } 

Funzionalmente lo stesso, ma è probabile che desidera 3 per indicare che getVect non cambia il tuo stato classe in modo const semantica possono essere applicate in modo corretto.

//4 - just move? 
std::vector<int> GetVect() 
    { 
    return std::move(vect); 
    } 

Sembra molto improbabile che si desidera questo, dopo aver chiamato GetVect l'interno vect sarà più contenere alcun elemento.

//5 - move with {}? 
std::vector<int> GetVect() 
    { 
    return { std::move(vect) }; 
    } 

Questo dovrebbe finire per essere lo stesso di 4, è sufficiente chiamare il costruttore mossa dell'oggetto ritorno più esplicitamente.

Per prestazioni quello che si potrebbe effettivamente desidera è questo:

const std::vector<int>& GetVect() const 
{ 
    return vect; 
} 

questo modo è possibile leggere l'oggetto, senza la necessità per la copia. Se si desidera scrivere sul vettore restituito, creare una copia in modo esplicito. Maggiori dettagli possono essere trovati in this question

+0

Alla tua prima risposta, non penso che ti serva una copia. guarda qui https://web.archive.org/web/20130930101140/http://cpp-next.com/archive/2009/08/want-speed-pass-by-value puoi semplicemente usare lo swap – CrSe

+1

Il codice che hai postato sta copiando. Se si farebbe uno [scambio] (http://en.cppreference.com/w/cpp/container/vector/swap) si applicano gli stessi problemi di 4 e 5, lo stato interno della classe verrebbe modificato. Di solito non lo vuoi per una funzione 'get'. – KillianDS

Problemi correlati