/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 开发环境中设置此编译器选项
打开项目的“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性。
选择“配置属性”>“C/C++”>“优化”属性页面。
修改“大小或速度优先”属性。
以编程方式设置此编译器选项
- 请参阅 FavorSizeOrSpeed。