/OPT(优化)
控制 LINK 在生成期间执行的优化。
语法
/OPT:{REF | NOREF}
/OPT:{ICF[iterations] | NOICF}=
/OPT:{LBR | NOLBR}
参数
REF | NOREF
/OPT:REF 清除从未引用的函数和数据;/OPT:NOREF 保留从未引用的函数和数据。
当启用 /OPT:REF 时,LINK 会移除未引用的已打包函数和数据(称为 COMDAT)。 此优化称为可传递的 COMDAT 消除。 /OPT:REF 选项还可禁用增量链接。
在类声明中定义的内联函数和成员函数始终为 COMDAT。 如果使用 /Gy 选项编译对象文件,则会将文件中的所有函数转换为 COMDAT。 若要将 const
数据放入 COMDAT 中,必须使用 __declspec(selectany)
声明数据。 有关如何指定用于移除和折叠的数据的信息,请参阅 selectany。
默认情况下,除非指定了 /OPT:NOREF 或 /DEBUG,否则链接器启用 /OPT:REF。 若要重写此默认值并在程序中保留未引用的 COMDAT,请指定 /OPT:NOREF。 可以使用 /INCLUDE 选项重写特定符号的移除。
如果指定了 /DEBUG,则 /OPT 的默认项是 NOREF,而且所有函数都保留在映像中。 若要重写此默认项并优化调试生成,请指定 /OPT:REF。 这可以减小可执行文件的大小,即使在调试版本中也会是一项十分有用的优化。 此外,建议指定 /OPT:NOICF 以在调试版本中保留相同的函数。 这样更容易读取堆栈跟踪以及在本应折叠在一起的函数中设置断点。
ICF[iterations] | NOICF=
使用 ICF[iterations] 执行相同的 COMDAT 折叠。= 可以从链接器输出中删除冗余 COMDAT。 可选 iterations 参数指定遍历符号以查找重复项的次数。 默认迭代次数是 1 次。 附加的迭代可以找到更多前一次迭代中未通过折叠发现的重复项。
默认情况下,除非指定了 /OPT:NOICF 或 /DEBUG,否则链接器启用 /OPT:ICF。 若要重写此默认值并阻止在程序中折叠 COMDAT,请指定 /OPT:NOICF。
在调试版本中,必须显式指定 /OPT:ICF 以启用 COMDAT 折叠。 但是,由于 /OPT:ICF 能合并相同的数据或函数,因此它也能更改显示在堆栈跟踪中的函数名称。 它还能使你无法在某些函数中设置断点或在调试器中检查某些数据,并让你在单步执行代码时进入意外的函数。 代码行为完全相同,但调试器呈现可能会非常混乱。 因此,建议不在调试版本中使用 /OPT:ICF,除非较小的代码的好处能弥补这些不足。
注意
由于 /OPT:ICF 可以使同一地址分配给不同的函数或只读数据成员(即使用 /Gy 编译的 const
变量),因此它能中断依赖于函数或只读数据成员的唯一地址的程序。 有关详细信息,请参阅 /Gy (启用函数级链接)。
LBR | NOLBR
/OPT:LBR 和 /OPT:NOLBR 选项仅适用于 ARM 二进制文件。 由于某些 ARM 处理器分支指令的范围有限,因此如果链接器检测到跳转的地址超出范围,它就会将分支指令的目标地址替换成包含指向实际目标的分支指令的代码“岛”的地址。 可使用 /OPT:LBR 来优化对长分支指令的检测和中间代码岛的布局,以便最大程度减少总体代码大小。 /OPT:NOLBR 指示链接器为遇到的长分支指令生成代码岛,但不进行优化。
默认情况下,增量链接未启用时会设置 /OPT:LBR 选项。 如果需要非增量链接而不是长分支优化,请指定 /OPT:NOLBR。 /OPT:LBR 选项禁用增量链接。
注解
在命令行上使用时,链接器默认为 /OPT:REF,ICF,LBR。 如果指定了 /DEBUG,则默认值为 /OPT:NOREF,NOICF,NOLBR。
/OPT 优化通常可减小映像大小并加快程序速度。 这些改进在较大型的程序中可能相当重要,因此在零售版本中默认启用它们。
链接器优化在前期确实需要花费额外的时间,但优化的代码也节省了时间,因为链接器需要修复的重定位更少,且创建更小的最终映像,而且它还能节省更多的时间,因为它需要处理并写入 PDB 的调试信息更少。 启用优化后,可以缩短整体链接时间,因为链接器传递更小二进制文件所节省的时间可远远抵消分析过程所产生的少量额外成本。
可以一起指定 /OPT 参数,将其用逗号分隔。 例如,可以指定 /OPT:REF,NOICF,而不是 /OPT:REF /OPT:NOICF。
可使用 /VERBOSE 链接器选项查看由 /OPT:REF 移除的函数和由 /OPT:ICF 折叠的函数。
通常为使用 Visual Studio IDE“新建项目”对话框创建的项目设置 /OPT 参数,并且针对调试和发布配置通常具有不同的值。 如果未为项目中的这些链接器选项设置任何值,则可以获取项目默认值,这些值可能不同于链接器在命令行中使用的默认值。
在 Visual Studio 开发环境中设置 OPT:ICF 或 OPT:REF 链接器选项
打开项目的“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性。
选择“配置属性”>“链接器”>“优化”属性页。
修改以下属性之一:
启用 COMDAT 折叠
参考
在 Visual Studio 开发环境中设置 OPT:LBR 链接器选项
打开项目的“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性。
选择“配置属性”>“链接器”>“命令行”属性页 。
在“附加选项”中输入选项:
/opt:lbr
或/opt:nolbr
以编程方式设置此链接器选项
- 请参阅 EnableCOMDATFolding 和 OptimizeReferences 属性。