¿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::coutCon NRVO habilitado, la salida será:
Constructor called Destructor calledEn 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 calledEn 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.
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