Giusto per chiarire la "copia extra" che descrive @ecatmur, se push_back
ha ricevuto il suo argomento in base al valore, ciò che accadrebbe sarebbe che avresti iniziato con il tuo oggetto. Una copia di questo sarebbe passata a push_back
come parametro. Quindi push_back
creerebbe una copia di che inserisca nel vettore stesso.
Poiché la reale implementazione di push_back
riceve il suo argomento per riferimento, questa (push_back
) crea il nuovo oggetto nel vettore direttamente come una copia dell'oggetto originale.
Come già accennato, sì, con C++ 11 usando la semantica del movimento, sarebbe possibile (anche se probabilmente non particolarmente vantaggioso) passare l'argomento per valore, e quindi spostare il valore da tale argomento nel nuovo oggetto in il vettore. Se quello che stavi inserendo nel vettore era, per esempio, una stringa che per lo più contiene solo un puntatore e un paio di campi "bookkeeping" (quantità di memoria allocata, quantità di memoria attualmente in uso), sarebbe quasi come efficiente come passare un riferimento, perché una mossa può semplicemente fare una copia superficiale - copiare il puntatore e il libro mantenendo i valori stessi, invece di tutti i dati a cui punta. Se, tuttavia, l'oggetto in questione contenesse direttamente tutti i suoi dati (cioè non un puntatore), allora una mossa sarebbe lenta quanto una copia.
passaggio per riferimento, evita tutto che la copia, quindi, anche per qualcosa di simile a una corda, è generalmente più veloce ancora (per un caso come questo che l'oggetto originale non può essere invalidata). Ha anche il minor vantaggio di lavorare con C++ 98/03, non solo C++ 11.
fonte
2012-08-01 15:44:07
Lo farò. L'ho capito solo ieri e lo faccio da quel momento in poi. Grazie! – sachin2182