/OPT(优化)

更新:2007 年 11 月

控制 LINK 在生成期间执行的优化。

/OPT:{REF | NOREF}
/OPT:{ICF[=iterations] | NOICF}
/OPT:{WIN98 | NOWIN98}

参数

  • REF | NOREF
    /OPT:REF 清除从未引用的函数和/或数据,而 /OPT:NOREF 保留从未引用的函数和/或数据。

    默认情况下,LINK 移除未引用的封装函数。如果对象已经用 /Gy 选项编译过,它包含封装函数 (COMDAT)。此优化称为可传递的 COMDAT 消除。若要重写该默认值并在程序中保留未引用的 COMDAT,请指定 /OPT:NOREF。可以使用 /INCLUDE 选项重写特定符号的移除。

    如果指定了 /DEBUG/OPT 的默认项是 NOREF(否则,为 REF),而且所有函数都保留在映像中。若要重写此默认项并优化调试生成,请指定 /OPT:REF/OPT:REF 选项禁用增量链接。

    必须显式地将数据标记为 COMDAT;使用 __declspec(selectany)

    如果指定了 /OPT:REF,默认情况下 /OPT:ICF 处于打开状态。如果需要 /OPT:REF 而不是 /OPT:ICF,则必须指定下面的内容:

    link /opt:ref /opt:noicf
    

    指定 /OPT:ICF 不激活 /OPT:REF 选项。

  • ICF[= iterations**] | NOICF**
    使用 /OPT:ICF[=iterations] 执行相同的 COMDAT 折叠。可以从链接器输出中移除多余的 COMDAT。iteration 指定遍历符号以查找重复项的次数。默认迭代次数是两次。附加的迭代可以找到前一次迭代中通过折叠未发现的重复项。

    请注意,默认情况下 ICF 有效时(显式指定 /OPT:REF),与显式指定 /OPT:REF,ICF 时,链接器行为是有区别的。默认的带 /OPT:REFICF 不折叠只读数据。这包括任何 .rdata、.pdata 和 .xdata。但是,默认的带 /OPT:REFICF 导致在为 Itanium 和 x64 生成映像时折叠较少的函数,因为这些模块中的函数具有更多的只读数据依赖项,例如 .pdata 和 .xdata。若要获得完整的 ICF,请显式指定 /OPT:ICF

    函数通过 /Gy 编译器选项放在 COMDAT 中,常数数据放在 COMDAT 中。有关如何为折叠指定数据的示例,请参见 selectany

    如果 REF 处于打开状态并且需要在调试生成中显式打开,则默认情况下 ICF 处于打开状态。如果指定了 REF,则可以指定 NOICF

    说明:

    /OPT:ICF 可导致相同的地址分配到不同的函数或只读数据成员(用 /Gy 编译的常数变量)。 因此,/OPT:ICF 可中断依赖于不同的函数或只读数据成员的地址的程序。 有关更多信息,请参见 /Gy(启用函数级链接)

  • WIN98 | NOWIN98
    WIN98NOWIN98 控制最终映像中的节对齐。对于 Windows 98 应用程序,最好是在 4K 的边界上对齐节,以改进加载时间(允许 Windows 98 内存管理器缓存可执行图像同时最少化浪费的空间)。默认情况下,此选项在链接器中是打开的,因此需要指定 /OPT:NOWIN98 以获得精简(但在 Windows 98 上较慢)的应用程序版本。

    默认情况下,WIN98 处于打开状态。WIN98 在下列情况下是关闭的:

    默认情况下,对于增长超过 25% 的映像(根据下面的平均增长公式)不启用 /OPT:WIN98。换句话说,对于较小的映像不启用 /OPT:WIN98。应显式启用 /OPT:WIN98 以确保不受此优化的影响。指定 /OPT:NOWIN98 以获取较小(但在 Windows 98 上较慢)的应用程序版本。

    Windows 98 中的增强只在可移植可执行图像中的节在页边界上开始时才有效。/OPT:WIN98 选项执行必要的文件对齐。

    如果要生成仅在 Windows NT 或 Windows 2000 上运行的组件,则应使用 /OPT:NOWIN98

    此更改不影响图像的加载或进程的工作集。唯一影响的是磁盘上的大小。

    以下内容有助于您使用 /OPT:WIN98 计算映像的平均增长:

    • 4096 个字节的文件对齐的平均浪费空间可以表征为:count-of-sections-in-image * 4096/2

    • 当前 512 个字节的文件对齐的平均浪费空间为:count-of-sections-in-image * 512/2

    因此增长为:

    • 以字节为单位计数的增长 = count-of-sections-in-image * (4096/2 - 512/2)

      简化后为

      以字节为单位计数的增长 = count-of-sections-in-image * 1792

      然而,这并没有考虑图像标题必须按节对齐进行填充的事实。由于标题总是 512 字节或更少,因此额外的增长是一个常数,即 4096 - 512 或 3584。

    • 平均以字节为单位计数的增长 = count-of-sections-in-image * 1792 + 3584

    • 最大以字节为单位计数的增长 = count-of-sections-in-image * (4096 - 512 + 3584)

    若要获取节的计数,请对可执行文件使用 Dumpbin 工具。摘要将为您提供该图像中节的列表。一般看到的是有 3 到 5 节添加到该值。

    唯一不应使用 /OPT:WIN98 的情况是当可移植的可执行映像非常小时。即使图像注定是要下载的,浪费的空间也充满 0 并且压缩良好。

备注

优化通常是以增加链接时间为代价,减小图像大小并加快程序速度。

可使用 /VERBOSE 选项查看由 /OPT:REF 移除的函数和由 /OPT:ICF 折叠的函数。

在 Visual Studio 开发环境中设置此链接器选项

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

  2. 单击“链接器”文件夹。

  3. 单击“优化”属性页。

  4. 修改下列任一属性:

    • 启用 COMDAT 折叠

    • Windows 98 优化

    • 参考

以编程方式设置此链接器选项

请参见

参考

设置链接器选项

链接器选项