"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > 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 ?

Publié le 2024-11-11
Parcourir:147

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 du 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 

Avec NRVO activé, la sortie sera :

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 de -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 soit 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.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3