Soy consciente de que no es normalmente una buena idea volver con std::move
, es decir¿Está regresando con `std :: move` sensible en el caso de declaraciones de devolución múltiples?
bigObject foo() { bigObject result; /*...*/ return std::move(result); }
en lugar de simplemente
bigObject foo() { bigObject result; /*...*/ return result; }
porque se pone en el camino de la optimización del valor de retorno. Pero lo que en el caso de una función con múltiples retornos diferentes, sobre todo algo así como
class bar {
bigObject fixed_ret;
bool use_fixed_ret;
void prepare_object(bigObject&);
public:
bigObject foo() {
if(use_fixed_ret)
return fixed_ret;
else{
bigObject result;
prepare_object(result);
return result;
}
}
};
creo optimización normales valor de retorno es imposible en tal función, por lo que sería una buena idea poner en
return std::move(result);
aquí, o más bien debería hacer (OMI más feo, pero eso es debatible)
bigObject foo() {
bigObject result;
if(use_fixed_ret)
result = fixed_ret;
else{
prepare_object(result);
}
return result;
}
No puedo hacer referencia al estándar, así que no responderé, pero estoy seguro de que no necesitas std :: move, creo que estás confundiendo RVO y copia elisión, copia elisión es la optimización que beneficia a algunos compiladores que tienen una única ruta de retorno. BigObject se convertirá en un valor R respecto a dónde regresó. – 111111
Sí, creo que copiar elisión es lo que quiero decir al principio. – leftaroundabout
Además, si le gusta el código limpio y las optimizaciones del nivel de código parecen, :), puede deshacerse de la rama 'else {...' en su función 'foo()'. Como si la primera afirmación fuera cierta, la segunda no será evaluada. – 111111