Estuve estudiando las referencias de rvalue últimamente y llegué a la conclusión de que es bastante ventajoso usar el valor de paso en todas partes donde se realizará la copia completa de un objeto (para una justificación completa, por ejemplo, How to reduce redundant code when adding rvalue reference operator overloads? y Want speed? Pass by value!), porque el compilador puede optimizar automáticamente una copia en casos como f(std::move(a));
, donde f
se define como void f(A a);
.¿Los compiladores usan automáticamente la semántica de movimiento cuando un objeto movible se usa por última vez?
Una consecuencia negativa de pasar por valor en todas partes es que todo el código se convierte en desorden con std::move
incluso en casos simples, tales como:
void Object::value(A a)
{
value_ = std::move(a);
}
Obviamente, si escribía solamente el siguiente:
void Object::value(A a)
{
value_ = a;
}
no debería ser difícil para el compilador reconocer que a
está cerca del final de su vida útil, incluso sin la pista y no me penaliza con copia adicional. De hecho, el compilador debería ser capaz de reconocer esto incluso en funciones complejas.
Las preguntas:
¿Es esta optimización permitido por el 0x estándar de C++?
¿Los compiladores lo emplean? Incluso en casos complejos, es decir, la función consiste en más de una línea.
¿Cuán confiable es esta optimización, es decir, puedo esperar que el compilador la utilice tanto como espero que el compilador aplique la optimización del valor de retorno?
"use pass-by-value en todas partes" - Por favor, ** no haga esto **. Solo hazlo si haces una copia del parámetro dentro de la función de todos modos, ¡no solo en todas partes! – Xeo
@ jons34yp ¿no es mejor pasar siempre por constante referencia? –
@Yet: Es mejor juzgar para cada caso lo que mejor se adapte. –