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