Maison >développement back-end >C++ >Le retour d'une variable locale par valeur détruit-il l'objet d'origine ?

Le retour d'une variable locale par valeur détruit-il l'objet d'origine ?

DDD
DDDoriginal
2024-11-09 13:15:02892parcourir

Does Returning a Local Variable by Value Destroy the Original Object?

É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!

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