Maison >développement back-end >C++ >Le retour d'une variable locale en C 17 détruit-il l'original ?

Le retour d'une variable locale en C 17 détruit-il l'original ?

DDD
DDDoriginal
2024-11-11 11:22:03912parcourir

Does Returning a Local Variable in C  17 Destroy the Original?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn