/OPT(优化)

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

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

参数

  • 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(启用函数级链接)

备注

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

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

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

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

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

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

  4. 修改下列任一属性:

    • 启用 COMDAT 折叠

    • Windows 98 优化

    • 引用

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

请参见

参考

设置链接器选项

链接器选项