O retorno de uma variável local retorna uma cópia e destrói o original (NRVO)?
Introdução:
A questão examina o comportamento de retornar uma variável local em C . Especificamente, ele explora se o objeto retornado é uma cópia ou o objeto original e como isso impacta a destruição da variável local.
Otimização do valor de retorno (NRVO):
Com NRVO (nomeado otimização do valor de retorno) habilitado, o compilador otimiza a instrução de retorno para evitar construção de cópia desnecessária ou destruição da variável local. Ele consegue isso construindo diretamente o objeto de retorno no armazenamento de destino, eliminando a sobrecarga de cópias ou movimentações intermediárias. O NRVO se aplica quando condições específicas são atendidas, como a variável local ter duração de armazenamento automática e ser do mesmo tipo que o tipo de retorno.
Exemplo com NRVO ativado:
Considere o seguinte código:
class Test { public: Test(int p) { std::coutCom NRVO habilitado, a saída será:
Constructor called Destructor calledNesse caso, NRVO otimiza a instrução de retorno e constrói o objeto o diretamente no armazenamento para a variável local t. O construtor é chamado uma vez e apenas um destruidor é chamado para o objeto o.
Exemplo com NRVO desabilitado:
No entanto, NRVO pode ser desabilitado usando o -fno-elide- sinalizador do compilador de construtores. Sem NRVO, o compilador executará explicitamente as etapas de construção e destruição da cópia.Constructor called Constructor called Destructor called Destructor calledNeste caso, o construtor é chamado duas vezes (para a variável local t e o objeto de retorno o). Além disso, tanto a variável local t quanto o objeto de retorno o são destruídos separadamente.
Conclusão:
O comportamento de retornar uma variável local depende se o NRVO está habilitado ou desabilitado. Com o NRVO habilitado, a variável local é otimizada e o construtor e o destruidor são chamados apenas uma vez para o objeto de retorno. Sem o NRVO, as etapas de construção e destruição da cópia são executadas explicitamente, invocando potencialmente o construtor e o destruidor várias vezes.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3