/LTCG(链接时代码生成)

更新:2007 年 11 月

/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/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 可以接受安全的 .netmodule,这些文件可以用 Visual C++ 中的 /clr:safe /LN/target:module 以及任何其他 Visual Studio 编译器创建。/LTCG 不接受用 /clr/clr:pure 生成的 .netmodule。

  • /LTCG:PGI 不接受用 /GL 和 /clr 编译的本机模块或用 /clr:pure 生成的纯模块

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

  1. 打开此项目的“属性页”对话框。有关详细信息,请参见修改项目设置

  2. 单击“配置属性”文件夹。

  3. 单击“常规”属性页。

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

还可以对特定生成应用 /LTCG,方法是从“生成”菜单中选择“按配置优化”,或者右键单击“解决方案资源管理器”中的项目名称并选择一个“按配置优化”选项。

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

请参见

参考

设置链接器选项

链接器选项