/Og (グローバルの最適化)
更新 : 2007 年 11 月
ローカルおよびグローバルな最適化、自動レジスタ割り当て、およびループ最適化を行います。使用は推奨されていません。
/Og
解説
使用できる最適化は次のとおりです。
ローカルおよびグローバルの共通部分式の削除
この最適化を行うと、共通部分式の値が 1 回だけ計算されます。次の例では、3 つの式の間で b と c の値が変更されない場合、b + c の計算結果がテンポラリ変数に代入され、b + c の代わりにこのテンポラリ変数が使用されます。
a = b + c; d = b + c; e = b + c;
共通部分式をローカルに最適化すると、コンパイラは短いコード セクション内で共通の部分式を探します。グローバルに最適化すると、すべての関数に共通の部分式を探します。
自動レジスタ割り当て
この最適化を行うと、頻繁に使う変数および部分式がレジスタに格納されます。register キーワードは無視されます。
ループの最適化
ループを最適化すると、不変の部分式がループ本体から削除されます。最適化したループには、ループを実行するたびに値が変わる式だけが残ります。次の例では、式 x + y はループ本体の中では変化しません。
i = -100; while( i < 0 ) { i += x + y; }
最適化後は、x + y が 1 回だけ計算されます。つまり、ループが実行されるたびには計算されません。
i = -100; t = x + y; while( i < 0 ) { i += t; }
ループの最適化は、エイリアスを使用しないとコンパイラで見なすことができる場合、効率が大幅に向上します。エイリアスの有無は、__restrict、noalias、または restrict で設定します。
メモ : optimize プラグマに g オプションを指定すると、グローバルな最適化の有効/無効を関数ごとに切り替えることができます。
/Og では、名前付き戻り値の最適化も有効になります。この最適化では、スタック ベースの戻り値のコンストラクタとデストラクタがコピーされません。詳細については、「/O1、/O2 (プログラム サイズ、実行速度)」を参照してください。
関連情報については、「/Oi (組み込み関数の生成)」、および「/Ox (最大限の最適化)」を参照してください。
Visual C++ 2005 では、/Og の使用は推奨されていません。代わりに /O1 または /O2 を使用してください。詳細については、「Visual C++ 2005 で使用を推奨されていないコンパイラ オプション」を参照してください。
Visual Studio 開発環境でこのコンパイラ オプションを設定するには
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。詳細については、「方法 : プロジェクト プロパティ ページを開く」を参照してください。
[C/C++] フォルダをクリックします。
[コマンド ライン] プロパティ ページをクリックします。
[追加のオプション]ボックスにコンパイラ オプションを入力します。
このコンパイラ オプションをコードから設定するには
- AdditionalOptions を参照してください。