Maison > développement back-end > C++ > le corps du texte

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

DDD
Libérer: 2024-11-09 13:15:02
original
811 Les gens l'ont consulté

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;
}
Copier après la connexion

Avec NRVO activé, le résultat sera :

Constructor called
Destructor called
Copier après la connexion

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal