"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿La devolución de una variable local en C++ utiliza la optimización del valor de retorno con nombre (NRVO) para evitar la construcción y destrucción de copias?

¿La devolución de una variable local en C++ utiliza la optimización del valor de retorno con nombre (NRVO) para evitar la construcción y destrucción de copias?

Publicado el 2024-11-11
Navegar:103

Does Returning a Local Variable in C   Utilize Named Return Value Optimization (NRVO) to Avoid Copy Construction and Destruction?

¿La devolución de una variable local devuelve una copia y destruye el original (NRVO)?

Introducción:
La pregunta examina el comportamiento de devolver una variable local en C. Específicamente, explora si el objeto devuelto es una copia o el objeto original, y cómo afecta la destrucción de la variable local.

Optimización del valor de retorno (NRVO):
Con Al habilitar NRVO (optimización del valor de retorno con nombre), el compilador optimiza la declaración de retorno para evitar la construcción de copias innecesarias o la destrucción de la variable local. Lo logra construyendo directamente el objeto devuelto en el almacenamiento de destino, eliminando la sobrecarga de copias o movimientos intermedios. NRVO se aplica cuando se cumplen condiciones específicas, como que la variable local tenga una duración de almacenamiento automático y sea del mismo tipo que el tipo de devolución.

Ejemplo con NRVO habilitado:
Considere la siguiente código:

class Test {
public:
    Test(int p) { std::cout 

Con NRVO habilitado, la salida será:

Constructor called
Destructor called

En este caso, NRVO optimiza la declaración de retorno y construye el objeto o directamente en el almacenamiento de la variable local t. El constructor se llama una vez y solo se llama a un destructor para el objeto o.

Ejemplo con NRVO deshabilitado:
Sin embargo, NRVO se puede deshabilitar usando -fno-elide- bandera del compilador de constructores. Sin NRVO, el compilador realizará los pasos de construcción y destrucción de la copia de forma explícita.

Constructor called
Constructor called
Destructor called
Destructor called

En este caso, el constructor se llama dos veces (para la variable local t y el objeto de retorno o). Además, tanto la variable local t como el objeto devuelto o se destruyen por separado.

Conclusión:
El comportamiento de devolver una variable local depende de si NRVO está habilitado o deshabilitado. Con NRVO habilitado, la variable local se optimiza y el constructor y el destructor se llaman solo una vez para el objeto devuelto. Sin NRVO, los pasos de construcción y destrucción de la copia se realizan explícitamente, invocando potencialmente al constructor y al destructor varias veces.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3