La especialización de std::swap
ahora es opcional, pero no obsoleta. La razón es el rendimiento.
Para el código de creación de prototipos, y quizás incluso para muchos códigos de envío, std::swap
será mucho más rápido. Sin embargo, si se encuentra en una situación en la que necesita buscar cada bit de su código, escribir un intercambio personalizado puede ser una gran ventaja de rendimiento.
Considere el caso en el que su clase tiene esencialmente un puntero propietario y el constructor de movimiento y la asignación de movimiento solo tienen que ocuparse de ese puntero.Contar las cargas y las tiendas de la máquina para cada miembro:
Mover constructor: 1 carga y 2 tiendas.
Asignación de movimiento: 2 cargas y 2 tiendas.
Intercambio personalizado: 2 cargas y 2 tiendas.
std::swap
es 1 movimiento de construcción y 2 asignaciones de movimiento, o: 5 cargas y 6 tiendas.
Un intercambio personalizado es potencialmente aún dos o tres veces más rápido que std::swap
. Aunque cada vez que intentas averiguar la velocidad de algo contando cargas y tiendas, ambos van a ser perversos rápidamente.
Nota: Al calcular el costo de su asignación de movimiento, asegúrese y tenga en cuenta que se moverá a un valor movido (en el algoritmo std::swap
). Esto a menudo niega el costo de una desasignación, aunque a costa de una sucursal.
Quiero decir que esto fue mencionado por Scott o Herb en _C++ y Beyond_, pero parece que no puedo encontrar nada al respecto. –
Relacionado: [Mover semántica == función de intercambio personalizada obsoleta?] (Http://stackoverflow.com/questions/6416385/move-semantics-custom-swap-function-obsolete) – Xeo
@Xeo: Gracias, me había olvidado por completo de esa pregunta/respuesta. ¿Obtengo puntos por ser consistente? :-) ¡De lo contrario hubiera sido pelirrojo! –