Le retour d'une variable locale détruit-il l'original ?
À partir de C 17, le fait de renvoyer une variable locale renvoie une copie ou détruit l'original dépend si l'optimisation est activée.
Avec optimisation (NRVO)
Avec l'optimisation activée (appelée optimisation de la valeur de retour nommée ou NRVO), le compilateur peut directement construire l'objet renvoyé dans le stockage où il serait copié/déplacé. Cela signifie que la variable locale d'origine n'est pas détruite.
Sans optimisation
Si l'optimisation est désactivée (en utilisant -fno-elide-constructors), NRVO est désactivé. La variable locale sera construite normalement, une copie ou un déplacement sera effectué et l'original sera détruit.
Exemple
Considérez le code suivant :
class test { public: test(int p) { cout << "Constructor: " << this << endl; } test(test&& c) noexcept { cout << "Move Constructor: " << this << endl; } ~test() { cout << "Destructor: " << this << endl; } }; test function() { test i(8); return i; }
Sortie avec optimisation (NRVO) :
Constructor: 0x7fff78e42887 Destructor: 0x7fff78e42887
Sortie sans optimisation :
Constructor: 0x7ffda9d94fe7 Move Constructor: 0x7ffda9d95007 Destructor: 0x7ffda9d94fe7 Destructor: 0x7ffda9d95007
Dans le cas optimisé, un seul objet est construit et détruit. Dans le cas non optimisé, deux objets sont construits et détruits en raison de la création d'une copie temporaire.
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!