¿Qué optimización proporciona la semántica de movimiento si ya tenemos RVO?
Hasta donde entiendo, uno de los propósitos de agregar semántica de movimiento es optimizar el código llamando al constructor especial para copiar objetos "temporales". Por ejemplo, enest respuesta vemos que se puede utilizar para optimizar talesstring a = x + y
cosas. Debido a que x + y es una expresión de valor de r, en lugar de una copia profunda, podemos copiar solo el puntero a la cadena y el tamaño de la cadena. Pero como sabemos, los compiladores modernos admiten optimización del valor de retorno, por lo tanto, sin utilizar la semántica de movimiento, nuestro código no llamará al constructor de la copi
Para probarlo, escribo este código:
#include <iostream>
struct stuff
{
int x;
stuff(int x_):x(x_){}
stuff(const stuff & g):x(g.x)
{
std::cout<<"copy"<<std::endl;
}
};
stuff operator+(const stuff& lhs,const stuff& rhs)
{
stuff g(lhs.x+rhs.x);
return g;
}
int main()
{
stuff a(5),b(7);
stuff c = a+b;
}
Y después de ejecutarlo en VC ++ 2010 y g ++ en modo de optimización, obtengo resultados vacíos.
¿Qué tipo de optimización es, si sin él mi código aún funciona más rápido? ¿Podría explicar lo que estoy entendiendo mal?