Maison  >  Article  >  développement back-end  >  Le renvoi d'une variable locale en C utilise-t-il l'optimisation de la valeur de retour nommée (NRVO) pour éviter la construction et la destruction de copies ?

Le renvoi d'une variable locale en C utilise-t-il l'optimisation de la valeur de retour nommée (NRVO) pour éviter la construction et la destruction de copies ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-10 02:21:02402parcourir

Does Returning a Local Variable in C   Utilize Named Return Value Optimization (NRVO) to Avoid Copy Construction and Destruction?

Le renvoi d'une variable locale renvoie-t-il une copie et détruit-il l'original (NRVO) ?

Introduction :
La question examine le comportement de retour d'une variable locale en C . Plus précisément, il explore si l'objet renvoyé est une copie ou l'objet original, et quel est son impact sur la destruction de la variable locale.

Optimisation de la valeur de retour (NRVO) :
Avec NRVO (nommé optimisation de la valeur de retour) activé, le compilateur optimise l'instruction return pour éviter la construction de copies inutiles ou la destruction de la variable locale. Il y parvient en construisant directement l'objet de retour dans le stockage cible, éliminant ainsi la surcharge liée aux copies ou aux déplacements intermédiaires. NRVO s'applique lorsque des conditions spécifiques sont remplies, telles que la variable locale ayant une durée de stockage automatique et étant du même type que le type de retour.

Exemple avec NRVO activé :
Considérez le code suivant :

class Test {
public:
    Test(int p) { std::cout << "Constructor called" << std::endl; }
    ~Test() { std::cout << "Destructor called" << std::endl; }
};

Test function() {
    Test t(5);  // local variable with automatic storage duration
    return t;    // return local variable
}

int main() {
    Test o = function();
    return 0;
}

Avec NRVO activé, la sortie sera be:

Constructor called
Destructor called

Dans ce cas, NRVO optimise l'instruction return et construit l'objet o directement dans le stockage de la variable locale t. Le constructeur est appelé une fois, et un seul destructeur est appelé pour l'objet o.

Exemple avec NRVO désactivé :
Cependant, NRVO peut être désactivé à l'aide du -fno-elide- indicateur du compilateur des constructeurs. Sans NRVO, le compilateur effectuera explicitement les étapes de construction et de destruction de copie.

Constructor called
Constructor called
Destructor called
Destructor called

Dans ce cas, le constructeur est appelé deux fois (pour la variable locale t et l'objet de retour o). De plus, la variable locale t et l'objet de retour o sont détruits séparément.

Conclusion :
Le comportement de retour d'une variable locale dépend du fait que NRVO est activé ou désactivé. Avec NRVO activé, la variable locale est optimisée et le constructeur et le destructeur ne sont appelés qu'une seule fois pour l'objet de retour. Sans NRVO, les étapes de construction et de destruction de copie sont effectuées explicitement, appelant potentiellement le constructeur et le destructeur plusieurs fois.

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