/Os
、/Ot
(コードのサイズの優先、実行速度の優先)
/Os
および/Ot
コンパイラ オプションでは、コードを最適化するときにサイズ (/Os
) と速度 (/Ot
) のどちらを優先するかを指定します。
構文
/Os
/Ot
解説
/Os
(コードのサイズの優先) を指定すると、速度よりもサイズを優先するようにコンパイラに指示が出され、EXE と DLL のサイズを最小限に抑えます。 コンパイラで、機能的に類似するマシン コードのシーケンスへの数多くの C コンストラクトと C++ コンストラクトを減らすことができます。 これらの違いによって、サイズと速度のトレードオフが生じることがあります。 /Os
オプションと /Ot
オプションは、一方がもう一方を優先するよう指定するときに使用します。
/Ot
(実行速度の優先) を指定すると、サイズよりも速度を優先するようにコンパイラに指示が出され、EXE と DLL の速度を最大化します。 /Ot
は、最適化が有効になっている場合の既定値です。 コンパイラで、機能的に類似するマシン コードのシーケンスへの数多くの C コンストラクトと C++ コンストラクトを減らすことができます。 これらの違いによって、サイズと速度のトレードオフが生じることがあります。 /Ot
オプションは、/O2
(速度の最速化) オプションによって暗黙的に指定されます。 /O2
オプションを指定すると、いくつかのオプションが組み合わさり、より高速なコードが生成されます。
Note
プロファイル テストの実行から収集された情報は、/Ob
、/Os
、または /Ot
を指定した場合に有効になる最適化をオーバーライドします。 詳細については、「ガイド付き最適化のプロファイル」を参照してください。
x86 固有の例
次のコード例は、/Os
(コードのサイズの優先) オプションと /Ot
(実行速度の優先) オプションの違いを示しています。
Note
この例では、/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
)、コンパイラでは乗算式を一連のシフトと LEA
命令として return ステートメントに明示的に実装し、高速であるものの長いコードのシーケンスを生成します。
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