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 en C 17 renvoie-t-il une copie et détruit-il l'original (NRVO) ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-22 06:50:15457parcourir

Does Returning a Local Variable in C  17 Return a Copy and Destroy the 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. :

  • La variable locale est construite normalement.
  • La variable locale est ensuite déplacée ou copiée (selon sa mobilité) vers le retour emplacement de la valeur.
  • La variable locale d'origine est détruite.

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!

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