Question

Dans un précédent question , il est apparu qu'une fonction de retour par valeur toujours simple copie son argument dans la variable return étant affectée de celui-ci.

Est-ce requis par la norme, ou la fonction peut être optimisée en construisant le « attribué à » variable même dans le corps de la fonction?

struct C { int i; double d; };

C f( int i, int d ) {
    return C(i,d); // construct _and_ copy-construct?
}

int main() {
    C c = f( 1, 2 ); 
}
Était-ce utile?

La solution

La norme permet à tout niveau d'omission de copie ici:

  • construire local temporaire, copie construire en une valeur de retour, et copier-construire la valeur de retour dans le « c » locale. ou
  • la construction d'un local temporaire et copier-construire que dans « c ». ou
  • construction "c" avec les arguments "i, j"

Autres conseils

La norme indique que le constructeur de copie ne doit pas être utilisé - voir la section 12.8 / 15:

  

15 A chaque fois qu'un objet de classe temporaire   est copiée à l'aide d'un constructeur de copie,   et cet objet et la copie ont la   même type cv-non qualifié, une   la mise en œuvre est autorisé à traiter   l'original et la copie en deux   différentes manières de se référer à la   même objet et non effectuer une copie à   tous, même si la copie de classe   constructeur ou destructeur ont latérale   effets.

Et beaucoup plus dans la même veine.

Way passe pas paramètre par référence et affecte le résultat à elle?

Il y a un très simple et bon moyen d'éviter ces considérations tout à fait - vous pouvez envisager de revenir un coup de pouce :: shared_ptr à l'objet créé - il sera pratiquement le même en ce qui concerne la facilité d'utilisation, mais votre objet ne sera sûrement pas copier inutilement -. et ce sera vrai aussi si vous le retourner si un couple de couches appels de fonction

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