Qu'est-ce que la copie d'élision? Qu'est-ce que l'optimisation de la valeur de retour (nommée)? Qu'impliquent-ils?
Dans quelles situations peuvent-ils se produire? Quelles sont les limitations?
- Si vous avez été référé à cette question, vous recherchez probablement l'introduction .
- Pour un aperçu technique, voir la référence standard .
- Voir les cas courants ici .
c++
optimization
c++-faq
return-value-optimization
copy-elision
Luchian Grigore
la source
la source
Réponses:
introduction
Pour un aperçu technique - passez à cette réponse .
Pour les cas courants où la copie est supprimée, passez à cette réponse .
L'élision de copie est une optimisation mise en œuvre par la plupart des compilateurs pour empêcher des copies supplémentaires (potentiellement coûteuses) dans certaines situations. Il rend possible le retour en valeur ou en valeur par transfert dans la pratique (des restrictions s'appliquent).
C'est la seule forme d'optimisation qui élude (ha!) La règle du «comme si» - l' élision de copie peut être appliquée même si la copie / le déplacement de l'objet a des effets secondaires .
L'exemple suivant tiré de Wikipedia :
Selon le compilateur et les paramètres, les sorties suivantes sont toutes valides :
Cela signifie également que moins d'objets peuvent être créés, vous ne pouvez donc pas non plus compter sur un nombre spécifique de destructeurs. Vous ne devriez pas avoir de logique critique à l'intérieur des constructeurs / destructeurs de copie / déplacement, car vous ne pouvez pas compter sur leur appel.
Si un appel à un constructeur de copie ou de déplacement est élidé, ce constructeur doit toujours exister et doit être accessible. Cela garantit que la suppression de copie n'autorise pas la copie d'objets qui ne sont normalement pas copiables, par exemple parce qu'ils ont un constructeur de copie / déplacement privé ou supprimé.
C ++ 17 : Depuis C ++ 17, Copy Elision est garanti quand un objet est retourné directement:
la source
Référence standard
Pour une vue et une introduction moins techniques - passez à cette réponse .
Pour les cas courants où la copie est supprimée, passez à cette réponse .
L'élision de copie est définie dans la norme dans:
12.8 Copie et déplacement d'objets de classe [class.copy]
comme
L'exemple donné est:
et a expliqué:
la source
Formes courantes d'élision de copie
Pour un aperçu technique - passez à cette réponse .
Pour une vue et une introduction moins techniques - passez à cette réponse .
(Nommé) L'optimisation de la valeur de retour est une forme courante d'élision de copie. Il fait référence à la situation où un objet renvoyé par la valeur d'une méthode a sa copie élidée. L'exemple présenté dans la norme illustre l' optimisation de la valeur de retour nommée , puisque l'objet est nommé.
Une optimisation régulière de la valeur de retour se produit lorsqu'un temporaire est renvoyé:
D'autres endroits communs où la suppression de la copie a lieu sont lorsqu'un temporaire est passé par valeur :
ou lorsqu'une exception est levée et interceptée par une valeur :
Les limitations courantes de l'élision de copie sont:
La plupart des compilateurs de qualité commerciale prennent en charge la suppression de copie et (N) RVO (en fonction des paramètres d'optimisation).
la source
L'élision de copie est une technique d'optimisation du compilateur qui élimine la copie / déplacement inutile d'objets.
Dans les circonstances suivantes, un compilateur est autorisé à omettre les opérations de copie / déplacement et donc à ne pas appeler le constructeur associé:
Même lorsque la suppression de copie a lieu et que le constructeur de copie / déplacement n'est pas appelé, il doit être présent et accessible (comme si aucune optimisation ne s'est produite), sinon le programme est mal formé.
Vous ne devez autoriser cette élision de copie que dans des endroits où elle n'affectera pas le comportement observable de votre logiciel. L'élision de copie est la seule forme d'optimisation autorisée à avoir (c'est-à-dire élide) des effets secondaires observables. Exemple:
GCC offre la
-fno-elide-constructors
possibilité de désactiver l'élision de copie. Si vous souhaitez éviter une élision de copie possible, utilisez-fno-elide-constructors
.Désormais, presque tous les compilateurs fournissent une élision de copie lorsque l'optimisation est activée (et si aucune autre option n'est définie pour la désactiver).
Conclusion
Avec chaque élision de copie, une construction et une destruction correspondante de la copie sont omises, économisant ainsi du temps CPU, et un objet n'est pas créé, économisant ainsi de l'espace sur le cadre de pile.
la source
ABC obj2(xyz123());
est-elle NRVO ou RVO? est-ce qu'il n'obtient pas la variable / objet temporaire commeABC xyz = "Stack Overflow";//RVO