/Os、/Ot(代码大小优先、代码速度优先)
最小化或最大化 EXE 和 DLL 的大小。
/Os
/Ot
备注
/Os(代码大小优先)通过指示编译器优选大小而非速度来最小化 EXE 和 DLL 的大小。 编译器可以将许多 C 和 C++ 构造缩小为功能类似的机器码序列。 这些差异有时在大小和速度之间提供了折中。 /Os 和 /Ot 选项允许在二者之间指定一个首选项:
/Ot(代码速度优先)通过指示编译器优选速度而非大小来最大化 EXE 和 DLL 的速度。 (这是默认设置。)编译器可以将许多 C 和 C++ 构造缩小为功能类似的机器码序列。 这些差异有时在大小和速度之间提供了折衷。 “最大化速度”(/O2) 选项隐含 /Ot 选项。 /O2 选项组合若干个选项以产生速度非常快的代码。
如果使用 /Os 或 /Ot,还必须指定 /Og 以优化代码。
备注
如果您指定 /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;
}
如下面的机器码片段所示,当出于大小考虑 (/Os) 编译 DIFFER.c 时,编译器将返回语句中的乘法表达式显式实现为乘法,以产生短小但较慢的代码序列:
mov eax, DWORD PTR _x$[ebp]
imul eax, 71 ; 00000047H
或者,当出于速度考虑 (/Ot) 编译 DIFFER.c 时,编译器将返回语句中的乘法表达式实现为一系列移位指令和 LEA 指令,以产生执行速度快但较长的代码序列:
mov eax, DWORD PTR _x$[ebp]
mov ecx, eax
shl eax, 3
lea eax, DWORD PTR [eax+eax*8]
sub eax, ecx
END x86 Specific
在 Visual Studio 开发环境中设置此编译器选项
打开项目的**“属性页”**对话框。 有关详细信息,请参见如何:打开项目属性页。
单击**“C/C++”**文件夹。
单击**“优化”**属性页。
修改**“优选大小或速度”**属性。
以编程方式设置此编译器选项
- 请参见 FavorSizeOrSpeed。