Partilhar via


/OPT (Otimizações)

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

/OPT:{REF | NOREF}
/OPT:{ICF[=iterations] | 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 /OFT:REF é habilitado, o LINK remove as funções e os dados empacotados não referenciados. Um objeto contém funções e dados empacotados (COMDATs) se tiver sido compilado usando a opção /Gy. Essa otimização é conhecida como eliminação COMDAT transitiva. Por padrão, /OPT:REF é habilitado em compilações sem depuração. 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.

    Quando /OPT:REF é habilitado explicitamente ou por padrão, um formato delimitado de /OPT:ICF que somente dobra funções idênticas é habilitado. Se você quiser /OPT:REF, mas não /OPT:ICF, especifique /OPT:REF,NOICF ou /OPT:NOICF.

    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. Como /OPT:REF implica /OPT:ICF, recomendamos que você também especifique /OPT:NOICF para preservar funções idênticas em compilações 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. A opção /OPT:REF desativa a vinculação incremental.

    Você precisa marcar explicitamente dados const como COMDAT; use __declspec (selectany).

    Especificar /OPT:ICF não habilita a opção /OPT:REF.

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

    O vinculador se comporta de modo diferente quando /OPT:REF é especificado – e ICF é aplicado por padrão – do que quando /OPT:REF,ICF é especificado explicitamente. O formulário de ICF que é habilitado com /OPT:REF isoladamente não dobra dados somente leitura – inclui .rdata, .pdata e .xdata. Portanto, menos funções são dobradas quando as imagens são geradas para o x64, pois as funções nesses módulos são mais dependentes de dados somente leitura, por exemplo, .pdata e .xdata. Para obter o comportamento de dobra ICF completo, especifique explicitamente /OPT:ICF.

    Para colocar funções em COMDATs, você usa a opção do compilador /Gy; para colocar dados const, você os declara __declspec(selectany). Para obter informações sobre como especificar dados para dobra, consulte selectany.

    Por padrão, ICF é ativado quando REF é ativado. Para substituir esse padrão se REF for especificado, use NOICF. Quando /OPT:REF não é especificado em uma compilação de depuração, você deve 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 levar você a funções inesperadas ao criar o código em etapa única. 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.

    Dica

    Como /OPT:ICF pode fazer com que o mesmo endereço seja atribuído a funções diferentes ou membros de dados somente leitura (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 do nível de função).

  • LBR | NOLBR
    As opções /OPT:LBR e /OPT:NOLBR se aplicam somente a binários 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

Geralmente, as otimizações reduzem o tamanho da imagem e aumentam a velocidade do programa a um custo de aumento do tempo de vinculação.

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

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, consulte Trabalhando com propriedades do projeto.

  2. No painel esquerdo, expanda Propriedades de Configuração, Vinculador, Otimização.

  3. Modifique uma destas propriedades:

    • Habilitar Dobra 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, consulte Configurando as propriedades do projeto do Visual C++.

  2. Selecione a pasta Vinculador.

  3. Selecione a página de propriedades de Linha de Comando.

  4. Insira a opção em Opções Adicionais:

    /opt:lbr

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

Consulte também

Referência

Definindo opções de vinculador

Opções de vinculador