/Os、/Ot (実行可能ファイルのサイズの優先、実行速度の優先)
更新 : 2007 年 11 月
EXE および DLL のサイズを最小または最大にします。
/Os
/Ot
解説
/Os (実行可能ファイルのサイズの優先) は、実行速度よりもサイズを優先させて、EXE および DLL のサイズを最小化します。C や C++ のソースの内容を機能的に同等でサイズの小さいマシン語コードに置き換えます。ただし、実行速度を高速化した結果、ファイル サイズが大きくなる場合もあります。/Os と /Ot では、そのいずれかを優先させることができます。
/Ot (実行速度の優先) は、サイズよりも実行速度を優先して、EXE や DLL の実行速度を最高速にします。これは、既定の設定です。C や C++ のソースの内容を機能的に同等でサイズの小さいマシン語コードに置き換えます。ただし、実行速度を高速化した結果、ファイル サイズが大きくなる場合もあります。/O2/O1、/O2 (プログラム サイズ、実行速度) (実行速度) オプションでは、/Ot オプションを暗黙で使うことになります。/O2 オプションでは、複数のオプションを組み合わせて高速なコードを生成します。
/Os または /Ot を使用する場合、コードを最適化するために /Og/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 をコンパイルすると、return ステートメントの乗算式が明示的に乗算として実装され、サイズは小さいが低速のコードが生成されます。
mov eax, DWORD PTR _x$[ebp]
imul eax, 71 ; 00000047H
これに対し、/Ot (実行速度の優先) で DIFFER.c をコンパイルすると、return ステートメントの乗算式が一連のシフト命令および LEA 命令として実装され、高速だがサイズの大きいコードが生成されます。
mov eax, DWORD PTR _x$[ebp]
mov ecx, eax
shl eax, 3
lea eax, DWORD PTR [eax+eax*8]
sub eax, ecx
← x86 固有の仕様
Visual Studio 開発環境でこのコンパイラ オプションを設定するには
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。詳細については、「方法 : プロジェクト プロパティ ページを開く」を参照してください。
[C/C++] フォルダをクリックします。
[最適化] プロパティ ページをクリックします。
[速度またはサイズを優先] プロパティを変更します。
このコンパイラ オプションをコードから設定するには
- FavorSizeOrSpeed を参照してください。