Solo para aclarar la "copia adicional" que describe @ecatmur, si push_back
recibió su argumento por valor, lo que sucedería sería que comenzaría con su objeto. Una copia de eso pasará a push_back
como su parámetro. Entonces push_back
crearía una copia de que poner en el propio vector.
Dado que la implementación real de push_back
recibe su argumento por referencia, (push_back
) crea el nuevo objeto en el vector directamente como una copia de su objeto original.
Como ya se mencionó, sí, con C++ 11 usando la semántica de movimiento, sería posible (aunque probablemente no particularmente ventajoso) pasar el argumento por valor, y luego mover el valor de ese argumento al nuevo objeto en el vector. Si lo que estaba poniendo en el vector era, por ejemplo, una cadena que contiene un puntero y un par de campos de "contabilidad" (cantidad de memoria asignada, cantidad de memoria actualmente en uso), sería casi como eficiente como pasar una referencia, porque un movimiento puede hacer una copia superficial; copie los valores del puntero y del libro, en lugar de todos los datos a los que apunta. Sin embargo, si el objeto en cuestión tenía todos sus datos directamente (es decir, no un puntero), un movimiento sería tan lento como una copia.
Pasando por referencia, evita todo que copia, por lo que incluso para algo así como una cadena, generalmente es más rápido (para un caso como este el objeto original no puede ser invalidado). También tiene la menor ventaja de trabajar con C++ 98/03, no solo con C++ 11.
Haré eso. Me di cuenta de eso solo ayer y lo estoy haciendo desde entonces. ¡Gracias! – sachin2182