/Os/Ot (コードのサイズの優先、実行速度の優先)

コンパイラ オプションとコンパイラ オプションでは/Os、コードの最適化時にサイズ (/Os) と速度 (/Ot) のどちらを優先するかを指定/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 開発環境でこのコンパイラ オプションを設定するには

  1. プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関する記事を参照してください。

  2. [構成プロパティ]>[C/C++]>[最適化] プロパティ ページを選択します。

  3. [速度またはサイズを優先] プロパティを変更します。

このコンパイラ オプションをコードから設定するには

関連項目

/O オプション (コードの最適化)
MSVC コンパイラ オプション
MSVC コンパイラのコマンド ライン構文