Si uso auto_ptr como valor de retorno de una función que rellena vectores grandes, esto hace que la función sea una función fuente (creará un auto_ptr interno y pasará la propiedad cuando devuelve un no const auto_ptr). Sin embargo, no puedo usar esta función con algoritmos STL porque, para acceder a los datos, necesito desrefigurar el auto_ptr. Un buen ejemplo supongo que sería un campo de vectores de tamaño N, con cada vector con 100 componentes. Si la función devuelve cada vector componente 100 por valor o por ref no es lo mismo, si N es grande.optimización del valor de retorno vs auto_ptr para vectores grandes
Además, cuando intento este código muy básico:
class t
{
public:
t() { std::cout << "ctor" << std::endl; }
~t() { std::cout << "dtor" << std::endl; }
};
t valueFun()
{
return t();
}
std::auto_ptr<t> autoFun()
{
return std::auto_ptr(new t());
}
tanto autoFun y llamadas divertidas resultado con la salida
Ctor Dtor
por lo que no puede ver realmente la variable automática que se está creando para pasar a la declaración de devolución. ¿Esto significa que la optimización del valor de retorno está configurada para la llamada valueFun? ¿ValueFun crea dos objetos automáticos en este caso?
¿Cómo puedo optimizar una población de una estructura de datos tan grande con una función?
¿Está preguntando si RVO también funcionará para sus vectores grandes? Si es así, ¿no puedes probarlo con un ejemplo como el de arriba? – juanchopanza
Cuando lo pruebo, ¿significa que funciona para todos los compiladores/plataformas? ¿Cómo sé que RVO está incluido en absoluto, debería leer las especificaciones del compilador? ¿Qué sucede si el código se compila en un clúster HPC con un compilador diferente y la biblioteca es grande? – tmaric
Sí, entiendo tu punto. Es una de esas cosas que el compilador puede, pero no es obligatorio, así que nunca puede estar seguro. Por cierto, ¿tienes soporte para C++ 11? – juanchopanza