/LTCG(链接时代码生成)

/LTCG[:NOSTATUS|:STATUS|:PGINSTRUMENT|:PGOPTIMIZE|:PGUPDATE]

备注

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

  • :PGINSTRUMENT(可选)
    指定链接器输出 .pgd 文件,以准备应用程序上的检测测试运行。 还可以使用 /PGD 选项为.pgd文件指定名称或位置。

    从检测运行中收集的数据用于创建优化的映像。 有关更多信息,请参见按配置优化。 此选项的缩写形式为 /LTCG:PGI。

  • :PGOPTIMIZE(可选)
    指定链接器使用在运行检测的二进制文件后创建的配置文件数据来创建优化的映像。 所有输入文件必须与用 /LTCG:PGI 指定的文件相同。 有关更多信息,请参见按配置优化。 此选项的缩写形式为 /LTCG:PGO。

  • :PGUPDATE(可选)
    允许在 :PGINSTRUMENT 阶段中指定的位置添加或修改输入文件的列表。但是,任何新的输入文件将不能使用按配置优化进行优化,而且若修改的输入文件的更改部分使在检测阶段为该代码收集的配置文件数据无效,则也不能使用按配置优化进行优化。有关更多信息,请参见按配置优化。 此选项的缩写形式为 /LTCG:PGU。

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

存在下列异常时,您无法将附加的链接器选项添加到未在 /LTCG:PGINSTRUMENT 运行中指定的 /LTCG:PGOPTIMIZE 或 /LTCG:PGUPDATE 运行:

指定到 /LTCG:PGINSTRUMENT 的任何链接器选项都不必指定到 /LTCG:PGOPTIMIZE;它们是隐式指定的。

本主题的其余部分将在链接时代码生成方面讨论 /LTCG。

/LTCG 隐式地与 /GL 一起使用。

如果将用 /GL 编译的模块或 MSIL 模块传递给链接器,则链接器将调用链接时代码生成(有关更多信息,请参见 用作链接器输入的 .netmodule 文件)。 如果在将 /GL 或 MSIL 模块传递给链接器时未显式指定**/LTCG** ,则链接器最终将检测到该问题并用 /LTCG 重新启动链接。 在将 /GL 和 MSIL 模块传递给链接器时,请显式指定 /LTCG,以获得尽可能快的生成性能。

/LTCG/INCREMENTAL一起使用无效。

当**/LTCG** 用于链接模块通过使用 /Og, /O1, /O2, or /Ox编译,则优化以下操作:

  • 跨模块内联

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

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

  • 小 TLS 位移(仅限 x86)

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

  • 改进的内存歧义消除(更好的全局变量和输入参数干扰信息)

备注

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

使用 /LTCG/Ogt 导致双对齐优化。

如果指定 /LTCG/Ogs ,不执行双精度对齐。 如果应用程序中的大多数函数是为速度编译的,只有少数几个函数是为大小编译的(例如,通过使用 optimize 杂注),当这些为大小优化的函数调用需要双字对齐的函数时,编译器将双倍对齐它们。

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

  • 在寄存器中传递参数

  • 重新将参数排序以对齐

  • 移除未使用的参数

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

备注

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

/LTCG 和 MSIL 模块

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

  • /LTCG 可以接受本机对象文件、混合本机/托管对象文件(用 /clr 编译)、纯对象文件(用 /clr:pure 编译)和安全对象文件(用 /clr:safe 编译)

  • /LTCG 可以接受安全的 .netmodules,可以使用 Visual C++ 在其他 Visual Studio 编译器的 /clr:safe /LN/target:module创建。/LTCG 不接受使用 /clr/clr:pure生成的 .Netmodules。

  • /LTCG:PGI 不接受本机模块编译使用 /GL/clr、纯模块 (由于使用 /clr:pure)

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

  1. 打开此项目的**“属性页”**对话框。 请参见使用项目属性

  2. 选择**“配置属性”**文件夹。

  3. 选择**“常规”**属性页。

  4. 修改**“全程序优化”**属性。

还可以应用 /LTCG 为特定生成通过选择 生成中,菜单栏上的 按配置优化,或通过选择项目快捷菜单的某个配置文件引导优化选项。

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

请参见

参考

设置链接器选项

链接器选项