Maison >développement back-end >C++ >Le renvoi d'une variable locale en C 17 renvoie-t-il une copie et détruit-il l'original (NRVO) ?
Le renvoi d'une variable locale renvoie-t-il une copie et détruit l'original (NRVO) ?
En C 17, lorsque l'optimisation est activée (en particulier , nommé optimisation de la valeur de retour ou NRVO), le renvoi d'une variable locale n'implique pas la copie de l'objet d'origine. Au lieu de cela, le compilateur optimise le code pour construire l'objet renvoyé directement dans le stockage où il serait autrement copié. Cela signifie que l'objet d'origine est effectivement déplacé vers l'emplacement de la valeur de retour et qu'aucun destructeur n'est appelé.
Cependant, si l'optimisation est désactivée (à l'aide de l'indicateur -fno-elide-constructors), le comportement par défaut est suivi. :
Dans le code que vous avez fourni :
test function() { test i(8); return i; }
Avec NRVO activé, un seul appel de constructeur et de destructeur sont observés, indiquant que l'objet i d'origine est déplacé vers l'emplacement de la valeur de retour sans copie.
Avec NRVO désactivé, le constructeur et les appels de destructeur sont observés à la fois pour l'objet i d'origine et l'objet de valeur de retour, indiquant que l'objet i d'origine est copié puis détruit.
Par conséquent, la réponse à votre question dépend de l'activation ou non de l'optimisation. Avec NRVO activé, le renvoi d'une variable locale ne renvoie pas de copie et ne détruit pas l'original. Avec NRVO désactivé, il renvoie une copie et détruit l'original.
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!