Partager via


/Zc:nrvo (Contrôle facultatif NRVO)

L’option du compilateur contrôle le /Zc:nrvo comportement d’élision de retour facultatif C++ standard nommé (NRVO) ou déplace le comportement d’élision.

Syntaxe

/Zc:nrvo[-]

Notes

Dans Visual Studio 2022 version 17.4 et ultérieure, vous pouvez activer explicitement le comportement de copie ou de déplacement facultatif à l’aide de l’option du /Zc:nrvo compilateur. Cette option est désactivée par défaut, mais elle est définie automatiquement lorsque vous compilez à l’aide de l’option /O2 , de l’option /permissive- ou /std:c++20 d’une version ultérieure. Sous /Zc:nrvo, copiez et déplacez l’élision est effectuée dans la mesure du possible. La copie facultative ou l’élision de déplacement peuvent également être désactivées explicitement à l’aide de l’option /Zc:nrvo- . Ces options du compilateur contrôlent uniquement la copie facultative ou déplacent l’elision. Impossible de désactiver la copie obligatoire ou l’élision de déplacement (spécifiée par la norme C++).

Copie obligatoire et élision de déplacement

La norme C++ nécessite l’élision de copie ou de déplacement lorsque la valeur retournée est initialisée dans le cadre de l’instruction return. Par exemple, il est nécessaire lorsqu’une fonction retourne un ExampleType retour à l’aide return ExampleType();de . Le compilateur MSVC effectue toujours la copie et déplace l’élision pour return les instructions quand elle est requise, même sous /Zc:nrvo-.

Copie facultative et déplacement d’élision

Lorsqu’une return instruction contient une expression de type non primitif, son exécution copie le résultat de l’expression dans l’emplacement de retour de la fonction appelante. Le compilateur appelle le constructeur de copie ou de déplacement du type retourné. Ensuite, à mesure que la fonction est sortie, les destructeurs pour les variables locales de fonction sont appelés, ce qui inclut toutes les variables nommées dans l’expression.

La norme C++ autorise (mais ne nécessite pas) le compilateur à construire éventuellement l’objet retourné directement dans l’emplacement de retour de la fonction appelante. Cette construction ignore (ou elides) le constructeur de copie ou de déplacement exécuté dans le cadre de l’instruction return . Contrairement à la plupart des autres optimisations, cette transformation est autorisée à avoir un effet observable sur la sortie du programme. À savoir, le constructeur de copie ou de déplacement et le destructeur associé sont appelés une fois moins. La norme exige toujours que la variable retournée nommée ait un constructeur de copie ou de déplacement défini, même si le compilateur elide le constructeur dans tous les cas.

Dans les versions antérieures à Visual Studio 2022 version 17.4, lorsque les optimisations sont désactivées (telles que sous /Od ou dans les fonctions marquées #pragma optimize("", off)) le compilateur effectue uniquement une copie obligatoire et déplace l’élision. Sous /O2, les anciens compilateurs effectuent une copie facultative ou déplacent l’élision lors du retour d’une variable nommée dans une fonction optimisée lorsque toutes ces conditions sont remplies : il n’a aucune boucle ni gestion des exceptions, il ne retourne pas plusieurs symboles avec des durées de vie qui se chevauchent, le constructeur de copie ou de déplacement du type n’a pas d’arguments par défaut.

Visual Studio 2022 version 17.4 augmente le nombre d’emplacements où le compilateur effectue une copie facultative ou déplace des élisions sous /Zc:nrvo, si elle est activée explicitement ou automatiquement à l’aide des /O2options , /permissive-ou /std:c++20 ultérieures. Sous /Zc:nrvo, le compilateur effectue une copie facultative ou déplace l’élision lors du retour d’une variable nommée pour n’importe quelle fonction quand : il n’a aucune boucle ni gestion des exceptions (comme précédemment) ; il renvoie la variable à partir d’une boucle ; il a une gestion des exceptions ; le constructeur de copie ou de déplacement du type retourné a des arguments par défaut. Les élisions de copie ou de déplacement facultatives ne sont jamais effectuées lorsqu’elles /Zc:nrvo- sont appliquées, ou lorsque la fonction retourne plusieurs symboles avec des durées de vie qui se chevauchent, ou pour une levée d’une variable nommée.

Pour plus d’informations et des exemples d’élision de copie obligatoire et facultative sous /Zc:nrvo, consultez Amélioration de la copie et du déplacement d’elision dans le blog de l’équipe C++.

Pour définir cette option de compilateur dans Visual Studio

  1. Ouvrez la boîte de dialogue Pages de propriété du projet. Pour plus d’informations, consultez Définir le compilateur C++ et les propriétés de build dans Visual Studio.

  2. Sélectionnez la page de propriétés Propriétés de configuration>C/C++>Ligne de commande.

  3. Dans d’autres options, ajoutez /Zc:nrvo ou /Zc:nrvo-. Choisissez OK ou Appliquer pour enregistrer vos modifications.

Voir aussi

/Zc (Conformité)
/O2
/permissive-
/std (Spécifier la version du standard du langage)