Compartir vía


/Zc:nrvo (Control opcional NRVO)

La opción del compilador controla el /Zc:nrvo comportamiento de la optimización de valores devueltos (NRVO) opcional de Standard C++ o move elision.

Sintaxis

/Zc:nrvo[-]

Comentarios

En Visual Studio 2022, versión 17.4 y posteriores, puede habilitar explícitamente el comportamiento opcional de copia o mover elisión mediante la /Zc:nrvo opción del compilador. Esta opción está desactivada de forma predeterminada, pero se establece automáticamente cuando se compila con la /O2 opción , la /permissive- opción o /std:c++20 posterior. En /Zc:nrvo, se realiza la operación de copia y movimiento de la elisión siempre que sea posible. Las elisiones de copia o movimiento opcionales también se pueden deshabilitar explícitamente mediante la /Zc:nrvo- opción . Estas opciones del compilador solo controlan la copia opcional o mueven elision. No se puede deshabilitar la copia obligatoria o mover elision (especificada por el estándar de C++).

Copia obligatoria y movimiento elision

El estándar de C++ requiere copiar o mover elision cuando el valor devuelto se inicializa como parte de la instrucción return. Por ejemplo, es necesario cuando una función devuelve un ExampleType devuelto mediante return ExampleType();. El compilador de MSVC siempre realiza copias y mueve elision para return instrucciones cuando es necesario, incluso en /Zc:nrvo-.

Copiar y mover elision opcionales

Cuando una return instrucción contiene una expresión de tipo no primitivo, su ejecución copia el resultado de la expresión en la ranura de retorno de la función de llamada. El compilador invoca el constructor copy o move del tipo devuelto. A continuación, a medida que se sale de la función, se llaman destructores para variables locales de función, que incluye las variables denominadas en la expresión.

El estándar de C++ permite (pero no requiere) que el compilador construya opcionalmente el objeto devuelto directamente en la ranura de retorno de la función de llamada. Esta construcción omite (o elides) el constructor de copia o movimiento ejecutado como parte de la return instrucción . A diferencia de la mayoría de las otras optimizaciones, esta transformación puede tener un efecto observable en la salida del programa. Es decir, el constructor de copia o movimiento y el destructor asociado se llaman una vez menos. El estándar todavía requiere que la variable devuelta con nombre tenga un constructor de copia o movimiento definido, aunque el compilador elides el constructor en todos los casos.

En versiones anteriores a la versión 17.4 de Visual Studio 2022, cuando las optimizaciones están deshabilitadas (como en /Od o en funciones marcadas #pragma optimize("", off)), el compilador solo realiza una copia obligatoria y mueve elision. En /O2, los compiladores anteriores realizan una copia opcional o mueven elision al devolver una variable con nombre en una función optimizada cuando se cumplen todas estas condiciones: no tiene bucles ni control de excepciones, no devuelve varios símbolos con duraciones superpuestas, el constructor de copia o movimiento del tipo no tiene argumentos predeterminados.

La versión 17.4 de Visual Studio 2022 aumenta el número de lugares en los que el compilador copia o mueve las elisiones opcionales en /Zc:nrvo, ya sea habilitadas explícitamente o automáticamente mediante las /O2opciones , /permissive-o /std:c++20 posteriores. En /Zc:nrvo, el compilador realiza la copia opcional o mueve elision al devolver una variable con nombre para cualquier función cuando: no tiene bucles ni control de excepciones (como antes); devuelve la variable de un bucle; tiene control de excepciones; el constructor de copia o movimiento del tipo devuelto tiene argumentos predeterminados. Las elisiones de copia o movimiento opcionales nunca se realizan cuando /Zc:nrvo- se aplica, o cuando la función devuelve varios símbolos con duraciones superpuestas o para un lanzamiento de una variable con nombre.

Para obtener más información y ejemplos de elisión de copia obligatoria y opcional en /Zc:nrvo, vea Mejorar copiar y mover elision en el blog del equipo de C++.

Para establecer esta opción del compilador en Visual Studio

  1. Abra el cuadro de diálogo Páginas de propiedades del proyecto. Para más información, vea Establecimiento del compilador de C++ y de propiedades de compilación en Visual Studio.

  2. Seleccione la página de propiedades Propiedades de configuración>C/C++>Línea de comandos.

  3. En Opciones adicionales, agregue /Zc:nrvo o /Zc:nrvo-. Haga clic en Aceptar o en Aplicar para guardar los cambios.

Consulte también

/Zc (Conformidad)
/O2
/permissive-
/std (Especificar la versión estándar del lenguaje)