/LTCG (Geração de código para tempo de vinculação)

Use /LTCG para executar a otimização do programa inteiro ou, para criar a instrumentação do PGO (otimização guiada por perfil), execute o treinamento e crie builds com otimização guiada por perfil.

Sintaxe

/LTCG[:{INCREMENTAL|NOSTATUS|STATUS|OFF}]

Estas opções foram preteridas no Visual Studio 2015 em diante:

/LTCG:{PGINSTRUMENT|PGOPTIMIZE|PGUPDATE}

Argumentos

INCREMENTAL
(Opcional) Especifica que o vinculador só aplica a otimização do programa inteiro ou a LTCG (Geração de Código Durante o Tempo de Vinculação) aos arquivos afetados por uma edição, em vez de todo o projeto. Por padrão, esse sinalizador não é definido quando /LTCG é especificado e todo o projeto é vinculado usando a otimização do programa inteiro.

NOSTATUS | STATUS
(Opcional) Especifica se o vinculador exibe um indicador de progresso que mostra o percentual concluído da vinculação. Por padrão, essas informações de status não são exibidas.

OFF
(Opcional) Desabilita a Geração de Código Durante o Tempo de Vinculação. O vinculador trata todos os módulos compilados com /GL como se fossem compilados sem essa opção e qualquer módulo MSIL fará com que o link falhe.

PGINSTRUMENT
(Opcional) Essa opção foi preterida no Visual Studio 2015 em diante. Em vez disso, use /LTCG e /GENPROFILE ou /FASTGENPROFILE para gerar um build instrumentado para a otimização guiada por perfil. Os dados coletados de execuções instrumentadas são usados para criar uma imagem otimizada. Para obter mais informações, confira Otimizações guiadas por perfil. A forma abreviada dessa opção é /LTCG:PGI.

PGOPTIMIZE
(Opcional) Essa opção foi preterida no Visual Studio 2015 em diante. Em vez disso, use /LTCG e /USEPROFILE para criar uma imagem otimizada. Para obter mais informações, confira Otimizações guiadas por perfil. A forma abreviada dessa opção é /LTCG:PGO.

PGUPDATE
(Opcional) Essa opção foi preterida no Visual Studio 2015 em diante. Em vez disso, use /LTCG e /USEPROFILE para recriar uma imagem otimizada. Para obter mais informações, confira Otimizações guiadas por perfil. A forma abreviada dessa opção é /LTCG:PGU.

Comentários

A opção /LTCG instrui o vinculador a chamar o compilador e executar a otimização do programa inteiro. Faça também uma otimização guiada por perfil. Para obter mais informações, confira Otimizações guiadas por perfil.

Com as seguintes exceções, não é possível adicionar opções do vinculador à combinação do PGO de /LTCG e /USEPROFILE que não foram especificadas na combinação anterior de inicialização do PGO das opções /LTCG e /GENPROFILE:

As opções do vinculador especificadas junto com as opções /LTCG e /GENPROFILE para inicializar o PGO não precisam ser especificadas durante o build usando /LTCG e /USEPROFILE; elas ficam implícitas.

O restante deste artigo discute a geração de código de tempo de vínculo feita por /LTCG.

/LTCG está implícito com /GL.

O vinculador invoca a Geração de Código Durante o Tempo de Vinculação se ele recebe um módulo que foi compilado usando /GL ou um módulo da MSIL (confira Arquivos .netmodule como entrada do vinculador). Se você não especificar explicitamente /LTCG quando passar /GL ou módulos da MSIL para o vinculador, o vinculador acabará detectando essa situação e reiniciará a vinculação usando /LTCG. Especifique explicitamente /LTCG quando passar /GL e os módulos da MSIL para o vinculador a fim de obter o desempenho de build mais rápido possível.

Para obter um desempenho ainda mais rápido, use /LTCG:INCREMENTAL. Essa opção instrui o vinculador a só otimizar novamente os arquivos afetados por uma alteração no arquivo de origem, em vez do projeto inteiro. Essa opção pode reduzir consideravelmente o tempo de vinculação necessário. Essa opção não é a mesma opção que a vinculação incremental. Se você remover a opção /LTCG:INCREMENTAL, remova também qualquer opção /LTCGOUT para aprimorar os tempos de build e a utilização do disco.

/LTCG não é válido para uso com /INCREMENTAL.

Quando /LTCG é usada para vincular os módulos compilados usando /Og, /O1, /O2 ou /Ox, são executadas as seguintes otimizações:

  • Inlining entre módulos

  • Alocação de registro entre procedimentos (somente sistemas operacionais de 64 bits)

  • Convenção de chamada personalizada (somente x86)

  • Pequeno deslocamento do TLS (somente x86)

  • Alinhamento duplo de pilha (somente x86)

  • Desambiguidade de memória aprimorada (melhores informações de interferência para variáveis globais e parâmetros de entrada)

Observação

O vinculador determina quais otimizações foram usadas para compilar cada função e aplica as mesmas otimizações durante o tempo de vinculação.

O uso de /LTCG e /O2 gera a otimização de alinhamento duplo.

Se /LTCG e /O1 forem especificados, o alinhamento duplo não será executado. Se a maioria das funções de um aplicativo for compilada para velocidade, com algumas funções compiladas para tamanho (por exemplo, usando o pragma optimize), o compilador fará o alinhamento duplo das funções que são otimizadas para tamanho, caso elas chamem funções que exijam o alinhamento duplo.

Se o compilador puder identificar todos os sites de chamada de uma função, o compilador ignorará os modificadores de convenção de chamada explícitos e tentará otimizar a convenção de chamada da função:

  • passar parâmetros em registros

  • reordenar parâmetros quanto ao alinhamento

  • remover parâmetros não usados

Se uma função for chamada por meio de um ponteiro de função ou se uma função for chamada fora de um módulo que é compilado usando /GL, o compilador não tentará otimizar a convenção de chamada da função.

Observação

Se você usar /LTCG e redefinir mainCRTStartup, o aplicativo poderá ter um comportamento imprevisível relacionado ao código do usuário que é executado antes da inicialização dos objetos globais. Há três maneiras de resolver esse problema: não redefinir mainCRTStartup, não compilar o arquivo que contém mainCRTStartup usando /LTCG ou inicializar objetos e variáveis globais estaticamente.

/LTCG e módulos MSIL

Os módulos que são compilados usando /GL e /clr poderão ser usados como entrada para o vinculador quando /LTCG for especificado.

  • /LTCG pode aceitar arquivos-objeto nativos e arquivos-objeto nativos/gerenciados mistos (compilados usando /clr). As opções /clr:pure e /clr:safe do compilador foram preteridas no Visual Studio 2015 e estão sem suporte no Visual Studio 2017 e posteriores.

  • /LTCG:PGI não aceita módulos nativos compilados usando /GL e /clr

Para definir esta opção do compilador no ambiente de desenvolvimento do Visual Studio

A propriedade Whole Program Optimization define várias opções de compilador e vinculador, incluindo /LTCG. Recomendamos que você use essa propriedade para alterar as configurações de uma configuração de compilação inteira. Para definir a Otimização de Programa Completo para o seu projeto:

  1. Abra a caixa de diálogo Páginas de Propriedades do projeto. Para mais informações, consulte Definir propriedades de build e do compilador.

  2. Selecione a página de propriedades Propriedades da Configuração>Geral.

  3. Modifique a propriedade Otimização do Programa Inteiro. Escolha OK ou Aplicar para salvar as alterações.

Aplique também /LTCG a builds específicos escolhendo Build>Otimização Guiada por Perfil na barra de menus ou escolhendo uma das opções de otimização guiada por perfil no menu de atalho do projeto.

Para habilitar a Geração de Código de Tempo de Link separadamente ou definir uma opção específica de Geração de Código de Tempo de Link:

  1. Abra a caixa de diálogo Páginas de Propriedades do projeto.

  2. Selecione a página de propriedades Propriedades da Configuração>Vinculador>Otimização.

  3. Modifique a propriedade Link Time Code Generation para uma das seguintes opções:

    • Default
    • Usar a geração de código de tempo de link rápido (LTCG:incremental)
    • Usar a geração de código de tempo de link (LTCG)
    • Otimização Guiada por Perfil - Instrumento (LTCG:PGInstrument)
    • Otimização Guiada por Perfil - Otimização (LTCG:PGOptimize)
    • Otimização guiada por perfil - Atualização (LTCG:PGUpdate)
  4. Escolha OK ou Aplicar para salvar as alterações.

Para especificar se o vinculador exibe um indicador de progresso para Geração de Código de Tempo de Link:

  1. Abra a caixa de diálogo Páginas de Propriedades do projeto.

  2. Selecione a página de propriedades Propriedades da Configuração>Vinculador>Geral.

  3. Modifique a propriedade Status do link. Escolha OK ou Aplicar para salvar as alterações.

Para definir essa opção do compilador via programação

Confira também

Referência de vinculador MSVC
Opções do vinculador MSVC