/OPT (Otimizações)

Controla as otimizações que o LINK executa durante uma compilação.

Sintaxe

/OPT:{REF | NOREF}
/OPT:{ICF[=iterações] | NOICF}
/OPT:{LBR | NOLBR}

Argumentos

REF | NOREF

/OPT:REF elimina as funções e os dados que nunca são referenciados; /OPT:NOREF mantém as funções e os dados que nunca são referenciados.

Quando /OPT:REF é habilitado, o LINK remove as funções e os dados empacotados não referenciados, conhecidos como COMDATs. Essa otimização é conhecida como eliminação COMDAT transitiva. A opção /OPT:REF também desabilita a vinculação incremental.

Funções embutidas e funções membro definidas dentro de uma declaração de classe são sempre COMDATs. Todas as funções em um arquivo de objeto serão transformadas em COMDATs se elas forem compiladas usando a opção /Gy. Para colocar dados const em COMDATs, você precisa declará-los com __declspec(selectany). Para obter informações sobre como especificar dados para remoção ou dobra, consulte selectany.

Por padrão, /OPT:REF é habilitado pelo vinculador, a menos que /OPT:NOREF ou /DEBUG seja especificado. Para substituir esse padrão e manter COMDATs não referenciados no programa, especifique /OPT:NOREF. Você pode usar a opção /INCLUDE para substituir a remoção de um símbolo específico.

Se /DEBUG for especificado, o padrão para /OPT será NOREF, e todas as funções serão preservadas na imagem. Para substituir esse padrão e otimizar uma compilação de depuração, especifique /OPT:REF. Isso pode reduzir o tamanho do executável e ser uma otimização útil mesmo em builds de depuração. Recomendamos especificar também /OPT:NOICF para preservar funções idênticas em builds de depuração. Isso facilitará a leitura de rastreamentos da pilha e a definição de pontos de interrupção em funções que seriam combinadas em outros casos.

ICF[=iterações] | NOICF

Use ICF[=iteraçõess] para realizar dobras COMDAT idênticas. COMDATs redundantes podem ser removido da saída do vinculador. O parâmetro opcional iterações especifica o número de vezes a percorrer os símbolos em busca de duplicatas. O número de iterações padrão é 1. As iterações adicionais podem encontrar mais duplicatas que são descobertas com a dobra na iteração anterior.

Por padrão, /OPT:ICF é habilitado pelo vinculador, a menos que /OPT:NOICF ou /DEBUG seja especificado. Para substituir esse padrão e impedir que COMDATs sejam dobrados no programa, especifique /OPT:NOICF.

Em uma compilação de depuração, você precisa especificar /OPT:ICF explicitamente para habilitar para dobra COMDAT. No entanto, como /OPT:ICF pode mesclar dados ou funções idênticas, ele pode alterar os nomes de funções que aparecem em rastreamentos de pilha. Também pode tornar impossível a definição de pontos de interrupção em determinadas funções ou o exame de alguns dados no depurador, e pode levar você a funções inesperadas ao criar o seu código em etapa única. O comportamento do código é idêntico, mas a apresentação do depurador pode ser muito confusa. Portanto, não recomendamos que você use /OPT:ICF em compilações de depuração a menos que as vantagens do código menor superem essas desvantagens.

Observação

Como /OPT:ICF pode fazer com que o mesmo endereço seja atribuído a funções diferentes ou membros de dados somente leitura (isto é, variáveis const compiladas usando /Gy), isso pode interromper um programa que depende de endereços exclusivos para funções ou membros de dados somente leitura. Para obter mais informações, consulte /Gy (habilitar vinculação em nível de função).

LBR | NOLBR

As opções /OPT:LBR e /OPT:NOLBR se aplicam somente aos binários do ARM. Como certas instruções de ramificação do processador ARM têm um intervalo limitado, se o vinculador detectar um salto para um endereço fora do intervalo, ele substituirá o endereço de destino da instrução de ramificação pelo endereço de uma “ilha” de códigos que contém uma instrução de ramificação que tem como alvo o destino real. Você pode usar /OPT:LBR para otimizar a detecção de instruções de ramificação longas e de posicionamento de ilhas de códigos intermediários para minimizar o tamanho total do código. /OPT:NOLBR instrui o vinculador a gerar ilhas de códigos para instruções de ramificação longas à medida que são encontradas, sem otimização.

Por padrão, a opção /OPT:LBR é definida quando o vínculo incremental não está habilitado. Se você quiser um vínculo não incremental, mas não otimizações de ramificação longas, especifique /OPT:NOLBR. A opção /OPT:LBR desativa a vinculação incremental.

Comentários

Quando usado na linha de comando, o vinculador é padrão para /OPT:REF, ICF, LBR. Se /DEBUG for especificado, o padrão será /OPT:NOREF, NOICF, NOLBR.

As otimizações /OPT geralmente diminuem o tamanho da imagem e aumentam a velocidade do programa. Essas melhorias podem ser substanciais em programas maiores, razão pela qual estão habilitados por padrão para builds de varejo.

A otimização do vinculador leva tempo extra antecipadamente, mas o código otimizado também economiza tempo quando o vinculador tem menos realocações para corrigir e cria uma imagem final menor, e economiza ainda mais tempo quando tem menos informações de depuração para processar e gravar no PDB. Quando a otimização está habilitada, ela pode resultar em um tempo de vínculo mais rápido no geral, pois o pequeno custo adicional na análise pode ser mais do que compensado pela economia de tempo no vinculador passa por binários menores.

Os argumentos /OPT podem ser especificados juntos, separados por vírgulas. Por exemplo, em vez de /OPT:REF /OPT:NOICF, você pode especificar /OPT:REF, NOICF.

Você pode usar a opção de vinculador /VERBOSE para ver as funções que são removidas por /OPT:REF e as funções que são dobradas por /OPT:ICF.

Os argumentos /OPT geralmente são definidos para projetos criados usando a caixa de diálogo Novo Projeto no IDE do Visual Studio e geralmente têm valores diferentes para configurações de depuração e versão. Se nenhum valor for definido para essas opções de vinculador em seu projeto, você poderá obter os padrões do projeto, que podem ser diferentes dos valores padrão usados pelo vinculador na linha de comando.

Para definir a opção do vinculador OPT:ICF ou OPT:REF no ambiente de desenvolvimento do 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 da Configuração>Vinculador>Otimização.

  3. Modifique uma destas propriedades:

    • Ativar o dobramento COMDAT

    • Referências

Para definir a opção do vinculador OPT:LBR no ambiente de desenvolvimento do 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 da Configuração>Vinculador>Linha de Comando.

  3. Insira a opção em Opções adicionais:

    /opt:lbr ou /opt:nolbr

Para definir esta opção do vinculador por meio de programação

Confira também