Pregunta

Tengo una función que es similar al siguiente:

// Fetch 1 MB of data
void GetData(std::vector<char> & outData);

El 1 MB es exagerada, pero sólo quiero hacer el punto de que es preferible evitar copias innecesarias.

Si añado esta sobrecarga:

std::vector<char> GetData()
{
    std::vector<char> result;
    GetData(result);
    return result;
}

A continuación, ¿qué probabilidades hay de que RVO entrará en funcionamiento?

¿Fue útil?

Solución

Con la mayoría de los compiladores razonablemente recientes (por ejemplo, VS 2005 o más nuevos, gcc 3.4 o más reciente), que es esencialmente cierto. Sólo digo "más" porque no he probado cada compilador de la existencia. Cada nuevo compilador He mirado probablemente en los últimos 5 años o así lo ha incluido.

Otros consejos

RVO patada más probable es que en el, ya que es una optimización sencilla bonita, que ha estado disponible durante bastante tiempo. Sin embargo, con el fin de dar a este pedazo de código real valor práctico incluso moderadamente código de alto rendimiento que había necesidad NRVO. NRVO es más difícil de conseguir a través, ya que es relativamente nuevo. Sin embargo, está disponible. MS compilador, por ejemplo, implementa desde VS2005.

No creo que haya ninguna respuesta estándar a esto:. Depende de su compilador y lo que es capaz de

Si está pensando en implementar esta por conveniencia ¿por qué no tratar en el compilador (s) y, o bien observar el ensamblaje o el perfil it y ver qué pasa? La evidencia empírica acerca de lo que realmente hace su compilador es probablemente mejor que adivinar lo que algunos compiladores pueden o no pueden hacer.

  

A continuación, ¿qué probabilidades hay de que RVO entrará en funcionamiento?

Es el trabajo de un desarrollador de software para pensar, de no compilador.

Los compiladores son generalmente optimizado para hacer que el código de buena salud -. No el malo

Personalmente, yo uso la primera forma. Normalmente con un puntero en lugar de referencia -. Para poner de relieve el hecho de que el parámetro es la salida, no de entrada

Además, nota que cuando usted dice:

std::vector<char> GetData() 
{ 
//   :
    return result; 
}

vector<char> x = GetData();

En el destinatario de la llamada, result se copia a un "valor de retorno", y luego en la persona que llama, el "valor de retorno" se copia en x. NRVO puede deshacerse de una de esas copias, pero no ambos. El compilador está obligado a llamar a la ctor copia al menos una vez, ya que tiene que asumir la ctor copia tiene efectos secundarios que se deben hacer.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top