/Zc:nrvo
(Controle NRVO opcional)
A /Zc:nrvo
opção do compilador controla o comportamento de cópia ou elisão de movimentação de NRVO (otimização de valor de retorno nomeado) opcional do C++ padrão.
Sintaxe
/Zc:nrvo
[-
]
Comentários
No Visual Studio 2022 versão 17.4 e posterior, você pode habilitar explicitamente o comportamento de elisão de cópia ou movimentação opcional usando a opção do /Zc:nrvo
compilador. Essa opção está desativada por padrão, mas é definida automaticamente quando você compila usando a /O2
opção, a /permissive-
opção ou /std:c++20
ou posterior. Em /Zc:nrvo
, a elisão de copiar e mover é executada sempre que possível. A elisão opcional de copiar ou mover também pode ser explicitamente desativada usando a /Zc:nrvo-
opção. Essas opções do compilador controlam apenas a cópia opcional ou a elisão de movimentação. A elisão obrigatória de cópia ou movimentação (especificada pelo C++ Standard) não pode ser desabilitada.
Cópia obrigatória e elisão de movimentação
O padrão C++ requer elisão de cópia ou movimentação quando o valor retornado é inicializado como parte da instrução return. Por exemplo, é necessário quando uma função retorna um ExampleType
retorno usando return ExampleType();
. O compilador MSVC sempre executa a elisão de cópia e movimentação para return
instruções quando necessário, mesmo em /Zc:nrvo-
.
Elisão opcional de cópia e movimentação
Quando uma return
instrução contém uma expressão de tipo não primitivo, sua execução copia o resultado da expressão para o slot de retorno da função de chamada. O compilador invoca o construtor de cópia ou movimentação do tipo retornado. Em seguida, à medida que a função é encerrada, os destruidores para variáveis locais de função são chamados, o que inclui todas as variáveis nomeadas na expressão.
O padrão C++ permite (mas não exige) que o compilador construa opcionalmente o objeto retornado diretamente no slot de retorno da função de chamada. Essa construção ignora (ou elide) o construtor de cópia ou movimentação executado como parte da return
instrução. Ao contrário da maioria das outras otimizações, essa transformação pode ter um efeito observável na saída do programa. Ou seja, o construtor de cópia ou movimentação e o destruidor associado são chamados uma vez a menos. O padrão ainda exige que a variável retornada nomeada tenha um construtor copy ou move definido, mesmo que o compilador elimine o construtor em todos os casos.
Nas versões anteriores ao Visual Studio 2022 versão 17.4, quando as otimizações são desabilitadas (como em /Od
ou em funções marcadas #pragma optimize("", off)
), o compilador executa apenas a elisão obrigatória de cópia e movimentação. Em /O2
, os compiladores mais antigos executam a elisão opcional de cópia ou movimentação no retorno de uma variável nomeada em uma função otimizada quando todas essas condições são atendidas: ele não tem loops ou tratamento de exceção, não retorna vários símbolos com tempos de vida sobrepostos, o construtor de cópia ou movimentação do tipo não tem argumentos padrão.
O Visual Studio 2022 versão 17.4 aumenta o número de locais em que o compilador faz elisões opcionais de cópia ou movimentação em /Zc:nrvo
, se habilitado explicitamente ou automaticamente usando as /O2
opções , /permissive-
ou /std:c++20
ou posteriores. Em /Zc:nrvo
, o compilador executa a elisão opcional de cópia ou movimentação no retorno de uma variável nomeada para qualquer função quando: não tem loops ou tratamento de exceção (como antes); retorna a variável de um loop; tem tratamento de exceção; o construtor copy ou move do tipo retornado tem argumentos padrão. Elisões opcionais de copiar ou mover nunca são feitas quando /Zc:nrvo-
são aplicadas, ou quando a função retorna vários símbolos com tempos de vida sobrepostos, ou para um lançamento de uma variável nomeada.
Para obter mais informações e exemplos de elisão de cópia obrigatória e opcional em /Zc:nrvo
, consulte Melhorando a elisão de cópia e movimentação no blog da equipe do C++.
Para definir essa opção do compilador no Visual Studio
Abra a caixa de diálogo Páginas de Propriedades do projeto. Para obter detalhes, confira Definir as propriedades de build e do compilador do C++ no Visual Studio.
Selecione a página de propriedades Propriedades de Configuração>C/C++>Linha de Comando.
Em Opções adicionais, adicione
/Zc:nrvo
ou/Zc:nrvo-
. Escolha OK ou Aplicar para salvar as alterações.
Confira também
/Zc
(Conformidade)
/O2
/permissive-
/std
(Especificar a versão padrão da linguagem)