Consulta de std::move

30 views
Skip to first unread message

Luciano Ortiz

unread,
Nov 17, 2020, 10:00:25 AM11/17/20
to 7542 - Taller de Programación
Hola, tengo una duda un poco teorica. Si quiero hacer un pop de un elemento de una queue vi que puedo hacerlo por movimiento usando: 

elemento = std::move(cola.front()); 
elemento.pop();

 mi duda es, esto hace solamente que me ahorre una copia innecesaria del front lo cual lo hace mas performante, no? Y en cuanto a uso de memoria seguiria siendo lo mismo.

Matías Lafroce

unread,
Nov 17, 2020, 10:17:02 AM11/17/20
to tallerdepr...@googlegroups.com
Depende del contexto, pero generalmente sí.
cola.front() devuelve una referencia al primer elemento. Como es un T&, elemento va a llamar al constructor por referencia T::T(&). O si elemento ya fue creado antes, al asignación operator=(T&)
Si la clase T tiene sólo elementos trivialmente copiables (enteros, bools y esas cosas), el operador copia es igual al de movimiento y no pasa nada. Si la clase T tiene elementos más complejos (strings, vectores y otros recursos que usen memoria dinámica), el movimiento les ahorra reservar recursos para la copia.
Pero el compilador suele ser muy inteligente y no hay que descartar la posibilidad de que optimice esa copia por un movimiento si es posible.
Recordar que el operador movimiento por default aplica movimiento a todos sus atributos.


--
Has recibido este mensaje porque estás suscrito al grupo "7542 - Taller de Programación" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a tallerdeprograma...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/tallerdeprogramacion/36dc6a05-877f-4bdf-94ae-30ff26be4395n%40googlegroups.com.

Luciano Ortiz

unread,
Nov 17, 2020, 10:32:16 AM11/17/20
to 7542 - Taller de Programación
Genial gracias, y me queda una duda igual, asumiendo que el compilador no se diera cuenta de hacer esa optimización entonces si no hago el std::move estaria haciendo un alloc de más, cierto?
Noté que con o sin el std::move la cantidad de allocs que me muestra valgrind es la misma, eso seria prueba de que el compilador está haciendo ya esa optimizacion?
Saludos
Reply all
Reply to author
Forward
0 new messages