Partilhar via


/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 /O2opçõ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

  1. 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.

  2. Selecione a página de propriedades Propriedades de Configuração>C/C++>Linha de Comando.

  3. 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)