/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
STATUS
OFF
|NOSTATUS
||}]
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 Otimização de Programa Inteiro 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 build inteira. Para definir a Otimização de Programa Inteiro para o seu projeto:
Abra a caixa de diálogo Páginas de Propriedades do projeto. Para mais informações, consulte Definir propriedades de build e do compilador.
Selecione a página de propriedades Propriedades da Configuração>Geral.
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 ativar 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 Vinculação:
Abra a caixa de diálogo Páginas de Propriedades do projeto.
Selecione a página de propriedades Propriedades da Configuração>Vinculador>Otimização.
Modifique a propriedade Vincular Geração de Código de Tempo para uma das seguintes opções:
- Default
- Usar 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)
Escolha OK ou Aplicar para salvar as alterações.
Para especificar se o vinculador exibe um indicador de progresso para a Geração de Código de Tempo de Vinculação:
Abra a caixa de diálogo Páginas de Propriedades do projeto.
Selecione a página de propriedades Propriedades da Configuração>Vinculador>Geral.
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
- Consulte LinkTimeCodeGeneration.