/Os/Ot(代码大小优先、代码速度优先)

/Os/Ot 编译器选项指定在优化代码时是大小 (/Os) 优先还是速度 (/Ot) 优先。

语法

/Os
/Ot

备注

/Os(代码大小优先)通过指示编译器优先优化大小而不是速度来最小化 EXE 和 DLL 的大小。 编译器可以将许多 C 和 C++ 构造简化为功能相似的计算机代码序列。 有时,这些差异会在大小与速度之间进行权衡。 可以使用 /Os/Ot 选项为其中一个指定优先级:

/Ot(代码速度优先)通过指示编译器优先优化速度而不是大小来最大化 EXE 和 DLL 的速度。 启用优化时,/Ot 为默认值。 编译器可以将许多 C 和 C++ 构造简化为功能相似的计算机代码序列。 有时,这些差异会在大小与速度之间进行权衡。 /O2(最大化速度)选项隐含了 /Ot 选项。 /O2 选项组合了多个选项来生成更快的代码。

注意

如果指定 /Ob/Os/Ot,则通过分析测试运行收集的信息会重写任何本应生效的优化。 有关详细信息,请参阅按配置优化

特定于 x86 的示例

以下示例代码演示了 /Os(代码大小优先)选项与 /Ot(代码速度优先)选项之间的差异:

注意

本示例介绍使用 /Os/Ot 时的预期行为。 但是,不同版本之间的编译器行为可能会导致以下代码的不同优化。

/* differ.c
  This program implements a multiplication operator
  Compile with /Os to implement multiply explicitly as multiply.
  Compile with /Ot to implement as a series of shift and LEA instructions.
*/
int differ(int x)
{
    return x * 71;
}

如下面的计算机代码片段所示,当 differ.c 编译为大小 (/Os) 时,编译器在 return 语句中显式地将乘法表达式实现为乘法,以生成短而慢的代码序列:

mov    eax, DWORD PTR _x$[ebp]
imul   eax, 71                  ; 00000047H

或者,当 differ.c 编译为速度 (/Ot) 时,编译器在 return 语句中将乘法表达式实现为一系列的 shift 和 LEA 指令,以生成快而长的代码序列:

mov    eax, DWORD PTR _x$[ebp]
mov    ecx, eax
shl    eax, 3
lea    eax, DWORD PTR [eax+eax*8]
sub    eax, ecx

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

  1. 打开项目的“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性

  2. 选择“配置属性”>“C/C++”>“优化”属性页面

  3. 修改“大小或速度优先”属性。

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

另请参阅

/O 选项(优化代码)
MSVC 编译器选项
MSVC 编译器命令行语法