/Zc:nrvo
(Controle opcional NRVO)
A /Zc:nrvo
opção do compilador controla o comportamento de cópia ou remoção de movimento de NRVO (otimização de valor de retorno nomeado) padrão C++ opcional.
Sintaxe
/Zc:nrvo
[-
]
Comentários
No Visual Studio 2022 versão 17.4 e posterior, você pode habilitar explicitamente o comportamento de cópia ou mover elisão opcional usando a opção de /Zc:nrvo
compilador. Essa opção está desativada por padrão, mas é definida automaticamente quando você compila usando a opção, a /O2
/permissive-
opção ou /std:c++20
mais tarde. Em /Zc:nrvo
, a elisão de cópia e movimentação é realizada sempre que possível. A elisão opcional de cópia ou movimentação também pode ser explicitamente desabilitada usando a /Zc:nrvo-
opção. Essas opções do compilador controlam apenas a elisão opcional de cópia ou movimentação. A elisão obrigatória de cópia ou movimentação (especificada pelo padrão C++) não pode ser desabilitada.
Obrigatoriedade de cópia 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
retornado 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 instrução contém uma return
expressão de tipo não primitivo, sua execução copia o resultado da expressão no slot de retorno da função de chamada. O compilador invoca o construtor copy ou move do tipo retornado. Em seguida, à medida que a função é encerrada, os destruidores para variáveis de função local são chamados, o que inclui quaisquer 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 copy ou move 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 copy or move e o destruidor associado são chamados de uma vez a menos. O padrão ainda requer que a variável retornada nomeada tenha um construtor de cópia ou movimentação definido, mesmo se o compilador elide o construtor em todos os casos.
Em versões anteriores ao Visual Studio 2022 versão 17.4, quando as otimizações são desabilitadas (como sob /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 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 manipulação de exceções, 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.
Visual Studio 2022 versão 17.4 aumenta o número de locais onde o compilador faz cópia opcional ou mover elisões em /Zc:nrvo
, se habilitado explicitamente ou automaticamente usando as /O2
opções , /permissive-
ou /std:c++20
posterior. Em /Zc:nrvo
, o compilador executa 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 manipulação de exceção (como antes), retorna a variável de um loop, tem tratamento de exceção, o construtor copy or move do tipo retornado tem argumentos padrão. Elisões opcionais de cópia ou movimentação nunca são feitas quando é aplicada, ou quando /Zc:nrvo-
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)
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários