/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:REF 的 ICF 不折叠只读数据。这包括任何 .rdata、.pdata 和 .xdata。但是,默认的带 /OPT:REF 的 ICF 导致在为 Itanium 和 x64 生成映像时折叠较少的函数,因为这些模块中的函数具有更多的只读数据依赖项,例如 .pdata 和 .xdata。若要获得完整的 ICF,请显式指定 /OPT:ICF。
函数通过 /Gy 编译器选项放在 COMDAT 中,常数数据放在 COMDAT 中。有关如何为折叠指定数据的示例,请参见 selectany。
如果 REF 处于打开状态并且需要在调试生成中显式打开,则默认情况下 ICF 处于打开状态。如果指定了 REF,则可以指定 NOICF。
说明: /OPT:ICF 可导致相同的地址分配到不同的函数或只读数据成员(用 /Gy 编译的常数变量)。 因此,/OPT:ICF 可中断依赖于不同的函数或只读数据成员的地址的程序。 有关更多信息,请参见 /Gy(启用函数级链接)。
WIN98 | NOWIN98
WIN98 和 NOWIN98 控制最终映像中的节对齐。对于 Windows 98 应用程序,最好是在 4K 的边界上对齐节,以改进加载时间(允许 Windows 98 内存管理器缓存可执行图像同时最少化浪费的空间)。默认情况下,此选项在链接器中是打开的,因此需要指定 /OPT:NOWIN98 以获得精简(但在 Windows 98 上较慢)的应用程序版本。默认情况下,WIN98 处于打开状态。WIN98 在下列情况下是关闭的:
使用了 /ALIGN。
/MACHINE 的目标不是 x86。
/SUBSYSTEM 指定 WINDOWS 或 CONSOLE 以外的内容。
默认情况下,对于增长超过 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 开发环境中设置此链接器选项
打开此项目的“属性页”对话框。有关详细信息,请参见设置 Visual C++ 项目属性。
单击“链接器”文件夹。
单击“优化”属性页。
修改下列任一属性:
启用 COMDAT 折叠
Windows 98 优化
参考