Question

J'ai une fonction qui ressemble à ceci:

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

Le 1Mo est exagéré, mais je veux juste faire le point qu'il est préférable d'éviter les copies inutiles.

Si j'ajoute cette surcharge:

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

Alors, comment il est probable que RVO va botter?

Était-ce utile?

La solution

Avec la plupart des compilateurs raisonnablement récents (par exemple, VS 2005 ou plus récent, gcc 3.4 ou plus récent), il est essentiellement certain. Je dis que « la plupart » parce que je ne l'ai pas testé chaque compilateur existe. Chaque nouveau compilateur, je l'ai regardé en probablement les 5 dernières années environ a inclus.

Autres conseils

RVO donnera le coup le plus probable, car il est une optimisation joli simple, qui est disponible depuis un certain temps. Toutefois, afin de donner à ce morceau de code réelle valeur pratique même vous auriez modérément le code haute performance NRVO besoin. NRVO est plus difficile à venir à travers, car il est relativement nouveau. Pourtant, il est disponible. compilateur MS, pour un exemple, met en œuvre depuis VS2005.

Je ne pense pas qu'il y ait une réponse standard à ceci:. Cela dépend de votre compilateur et ce qu'il est capable de

Si vous envisagez de mettre en œuvre cette commodité pourquoi ne pas simplement essayer sur votre compilateur (s) et soit regarder à l'assemblée ou le profil et voir ce qui se passe? Les données empiriques sur ce que votre compilateur ne fait est probablement mieux que deviner ce que certains compilateurs peuvent ou ne peuvent pas faire.

  

Alors, comment il est probable que RVO va botter?

Il est un travail de développeur de logiciels de penser, de ne pas compilateur.

Compilateurs sont généralement optimisés pour faire le bon travail de code bien -. Pas le mauvais

Personnellement, j'utiliser la première forme. Normalement, avec un pointeur au lieu de référence. - à mettre en évidence le fait que le paramètre est l'une de sortie, pas d'entrée

En outre, notez que lorsque vous dites:

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

vector<char> x = GetData();

Dans le callee, result est copié dans une « valeur de retour », puis dans l'appelant, la « valeur de retour » est copié dans x. NRVO peut se débarrasser d'un de ces copies, mais pas les deux. Le compilateur est obligé d'appeler le ctor copie au moins une fois, parce qu'il doit assumer la ctor copie a des effets secondaires qui doivent être faites.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top