/LTCG(链接时间代码生成)

使用 /LTCG 执行全程序优化,或者创建按配置优化 (PGO) 检测、执行训练并创建按配置优化的生成。

语法

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

这些选项自 Visual Studio 2015 开始已弃用:

/LTCG:{PGINSTRUMENT|PGOPTIMIZE|PGUPDATE}

参数

INCREMENTAL
(可选)指定链接器仅将全程序优化或链接时间代码生成 (LTCG) 应用于受编辑影响的文件,而不是应用于整个项目。 默认情况下,在指定了 /LTCG 时不会设置此标志,且会通过使用全程序优化链接整个项目。

NOSTATUS | STATUS
(可选)指定链接器是否显示用来指示链接的完成百分比的进度指示器。 默认情况下不显示此状态信息。

OFF
(可选)禁用链接时代码生成。 链接器会将使用 /GL 编译的所有模块都视为在没有该选项的情况下进行编译,并且任何 MSIL 模块都会导致链接失败。

PGINSTRUMENT
(可选)这些选项自 Visual Studio 2015 开始已弃用。 请改用 /LTCG/GENPROFILE/FASTGENPROFILE 来生成按配置优化的检测的生成。 从检测过的运行中收集的数据用于创建优化的映像。 有关详细信息,请参阅按配置优化。 此选项的缩写为 /LTCG:PGI

PGOPTIMIZE
(可选)这些选项自 Visual Studio 2015 开始已弃用。 请改用 /LTCG/USEPROFILE 来生成优化的映像。 有关详细信息,请参阅按配置优化。 此选项的缩写为 /LTCG:PGO

PGUPDATE
(可选)这些选项自 Visual Studio 2015 开始已弃用。 请改用 /LTCG/USEPROFILE 来重新生成优化的映像。 有关详细信息,请参阅按配置优化。 此选项的缩写为 /LTCG:PGU

备注

/LTCG 选项通知链接器调用编译器并执行全程序优化。 还可以执行按配置优化。 有关详细信息,请参阅按配置优化

在以下例外情况中,无法将链接器选项添加到 /LTCG/USEPROFILE 的 PGO 组合,这些组合未在 /LTCG/GENPROFILE 选项之前的 PGO 初始化组合中指定:

在通过使用 /LTCG/USEPROFILE 进行生成时,不需要指定与 /LTCG/GENPROFILE 一起指定以初始化 PGO 的任何链接器选项,它们是隐含的。

本文其余部分将讨论由 /LTCG 执行的链接时间代码生成。

/LTCG 是使用 /GL 隐含的。

如果将使用 /GL 编译的模块或 MSIL 模块传递给链接器,链接器将调用链接时间代码生成(有关详细信息,请参阅用作链接器输入的 .netmodule 文件)。 如果在将 /GL 或 MSIL 模块传递给链接器时未显式指定 /LTCG,链接器最终将检测到此情况并使用 /LTCG 重启链接。 在将 /GL 和 MSIL 模块传递给链接器时,请显式指定 /LTCG,以获得尽可能高的生成性能。

为了获得更高的性能,请使用 /LTCG:INCREMENTAL。 此选项通知链接器仅重新优化受到源文件更改影响的文件,而不是重新优化整个项目。 此选项可以显著减少所需的链接时间。 此选项与增量链接选项不同。 如果删除 /LTCG:INCREMENTAL 选项,请删除任何用于改善生成时间和磁盘利用率的 /LTCGOUT 选项。

/LTCG 不适用于 /INCREMENTAL

/LTCG 用于链接使用 /Og/O1/O2/Ox 编译的模块时,将执行以下优化:

  • 跨模块内联

  • 过程间寄存器分配(仅限 64 位操作系统)

  • 自定义调用约定(仅限 x86)

  • 小型 TLS 置换(仅限 x86)

  • 堆栈双倍字长对齐(仅限 x86)

  • 改进了内存消歧(改善全局变量和输入参数的干扰信息)

注意

链接器确定编译每个函数时采用哪种优化并在链接时应用相同的优化。

使用 /LTCG/O2 会产生双倍字长对齐优化。

如果指定 /LTCG/O1,则不执行双倍字长对齐。 如果应用程序中的大多数函数针对速度进行了编译,只有少数几个函数针对大小进行了编译(例如,通过使用 optimize pragma),则当这些函数调用需要双倍字长对齐的函数时,编译器将对针对进行了大小优化的函数进行双倍字长对齐。

如果编译器可标识函数的所有调用站点,编译器将忽略显式调用约定修饰符并尝试优化函数的调用约定:

  • 在寄存器中传递参数

  • 重新排列参数以进行对齐

  • 删除未使用的参数

如果通过函数指针调用某个函数,或者在使用 /GL 编译的模块外部调用某个函数,则编译器不会尝试优化函数的调用约定。

注意

如果使用 /LTCG 并重新定义 mainCRTStartup,则应用程序可能有与在初始化全局对象之前执行的用户代码相关的不可预知的行为。 有三种方法可以解决此问题:不重新定义 mainCRTStartup、不使用 mainCRTStartup 编译包含 /LTCG 的文件,或以静态方式初始化全局变量和对象。

/LTCG 和 MSIL 模块

指定 /LTCG 时,使用 /GL/clr 编译的模块可用作链接器的输入。

  • /LTCG 可以接受本机对象文件,以及混合本机/托管对象文件(使用 /clr 编译的文件)。 /clr:pure/clr:safe 编译器选项在 Visual Studio 2015 中已弃用,并且在 Visual Studio 2017 及更高版本中不受支持。

  • /LTCG:PGI 不接受使用 /GL/clr 编译的本机模块

在 Visual Studio 开发环境中设置此编译器选项

“全程序优化”属性设置多个编译器和链接器选项,包括 /LTCG。 建议使用此属性来更改整个生成配置的设置。 为项目设置“全程序优化”:

  1. 打开项目“属性页” 对话框。 有关详细信息,请参阅设置编译器和生成属性

  2. 选择“配置属性”>“常规”属性页

  3. 修改 “全程序优化”属性。 选择“确定”或“应用”以保存更改。

可以通过选择菜单栏上的“生成”>“按配置优化”,或者选择项目快捷菜单上的其中一个“按配置优化”选项,将 /LTCG 应用于特定生成

单独启用“链接时间代码生成”或设置一个特定的“链接时间代码生成”选项:

  1. 打开项目“属性页” 对话框。

  2. 选择“配置属性”>“链接器”>“优化”属性页

  3. 将“链接时间代码生成”属性修改为以下选项之一

    • 默认
    • 使用快速链接时间代码生成 (LTCG:incremental)
    • 使用链接时间代码生成 (LTCG)
    • 配置文件引导式优化 - 检测 (LTCG:PGInstrument)
    • 配置文件引导式优化 - 优化 (LTCG:PGOptimize)
    • 配置文件引导式优化 - 更新 (LTCG:PGUpdate)
  4. 选择“确定”或“应用”以保存更改。

指定链接器是否显示链接时间代码生成的进度指示器:

  1. 打开项目“属性页” 对话框。

  2. 选择“配置属性”>“链接器”>“常规”属性页

  3. 修改“链接状态”属性。 选择“确定”或“应用”以保存更改。

以编程方式设置此编译器选项

另请参阅

MSVC 链接器参考
MSVC 链接器选项