funcion copiar c++ stl copy return-value temporary

copiar - ¿Devolviendo un c++ std:: vector sin una copia?



copy list c++ (3)

¿Es posible devolver un contenedor estándar desde una función sin hacer una copia?

Código de ejemplo:

std::vector<A> MyFunc(); ... std::vector<A> b = MyFunc();

Según tengo entendido, esto copia el valor de retorno en un nuevo vector b. ¿Hacer que la función devuelva referencias o algo así que permita evitar la copia?


Los valores ("temporales") vinculados a las referencias const tendrán su vida útil extendida hasta el final de la vida útil de la referencia. Entonces, si no necesita modificar ese vector, lo siguiente hará:

const std::vector<A>& b = MyFunc();

si necesita modificar el vector, simplemente codifíquelo de la manera más fácil de leer hasta que tenga una prueba (obtenida a través del perfilado) de que esta línea es importante en términos de rendimiento.

De lo contrario, confíe en C ++ 1x con sus referencias rvalue y la semántica de movimiento que viene "muy pronto ahora" y optimice esa copia sin que tenga que hacer nada.


Si puede modificar la firma de la función, entonces puede usar

std::vector<A>& MyFunc();

o

void MyFunc(std::vector<A>& vect);

También puede devolver un puntero inteligente, pero eso implica renovar el objeto.

some_smart_pointer<std::vector<A>> MyFunc();

HTH


Si su compilador es compatible con el NRVO, no se realizará ninguna copia, siempre que se cumplan ciertas condiciones en la función que devuelve el objeto. Afortunadamente, esto finalmente se agregó en Visual C ++ 2005 (v8.0) Esto puede tener un gran impacto en el rendimiento si el contenedor es grande, obviamente.

Si su propia documentación del compilador no dice si es compatible o no, debería poder compilar el código C ++ en el ensamblador (en modo optimizado / versión) y verificar lo que se hace usando una función de muestra simple.

También hay una excelente discusión más amplia here