Élision de copie et durée de vie de l'objet
Lors du retour d'une variable locale par valeur, on peut se demander si l'objet d'origine est détruit ou non. La réponse réside dans la compréhension de l'élision de copie.
Avec l'élision de copie (NRVO)
Lorsque l'optimisation (appelée optimisation de la valeur de retour nommée ou NRVO) est activée, le compilateur peut optimisez l'instruction return en construisant l'objet directement dans le stockage où il serait autrement copié. Par conséquent, l'objet d'origine n'est pas créé en premier lieu.
Exemple avec NRVO activé
Considérez le code suivant :
class Test { public: Test(int p) { cout << "Constructor called" << endl; } ~Test() { cout << "Destructor called" << endl; } }; Test function() { Test t(5); return t; } int main() { Test o = function(); return 0; }
Avec NRVO activé, le résultat sera :
Constructor called Destructor called
Seul l'objet o est construit et détruit, et l'objet d'origine t est optimisé.
Sans élimination de copie
Lorsque l'optimisation est désactivée (par exemple, -fno-elide-constructors), l'instruction return suivra la sémantique habituelle de copie/déplacement.
Exemple avec NRVO Désactivé
En utilisant le code ci-dessus avec NRVO désactivé, le résultat sera :
Constructor called Constructor called Destructor called Destructor called
Cette fois, les deux objets t et o sont construits et détruits, comme la copie/ déplacer la construction ne peut pas être optimisé.
Conclusion
Que ce soit le retour d'un local La variable par valeur détruit l'objet d'origine selon que NRVO est activé ou non. Avec NRVO, l'objet original peut être élidé, tandis que sans NRVO, il sera copié/déplacé selon la sémantique standard de copie/déplacement.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!