最適化の制限のサポート

最適化プラグマ

optimize プラグマを使用して、特定の関数の最適化を無効にします。プラグマの構文を次に示します。

構文

#pragma optimize("", on|off)

コンパイラーは、最初の引数の値を無視します。optimize の有効な 2 番目の引数は次のとおりです。

#pragma optimize("", off) を指定すると、一致する #pragma optimize("", on) 文まで、または変換単位の最後に到達するまで最適化が無効になります。次の例では、alpha() 関数の最適化は無効になり、omega() 関数の最適化は無効になりません。

例: 1 つの関数の最適化を無効にする

#pragma optimize("", off)

alpha() {

...

}

#pragma optimize("", on)

omega() {

...

}

次の例では、alpha() 関数と omega() 関数の両方の最適化が無効になります。

例: すべての関数の最適化を無効にする

#pragma optimize("", off)

alpha() {

...

}

omega() {

...

}

optimization_level プラグマ

optimization_level プラグマを使用して、1 つの関数またはすべての関数の最適化を制御します。プラグマの構文を次に示します。

構文

#pragma [intel|GCC] optimization_level n

intel|GCC は、使用する解釈を示します。n は最適化レベルを指定する整数値です。有効な値は次のとおりです。

最適化レベルに関する詳細は、「自動最適化」を参照してください。

Linux* と Mac OS* では、最適化制限の範囲は、次の表の -pragma-optimization-level コンパイラー・オプションに渡される引数によって変わることがあります。

構文

動作

#pragma intel optimization_level n

-pragma-optimization-level オプションに渡される引数に関係なく、指定された最適化レベルを使用して次の関数のみにプラグマを適用します。

#pragma GCC optimization_level n

または

#pragma GCC optimization_level reset

-pragma-optimization-level オプションに渡される引数に関係なく、指定された最適化レベルを使用して後続のすべての関数にプラグマを適用します。

reset を指定すると、以前指定した最適化レベルに戻り、最近の #pragma GCC optimization_level 文がリセットされます。

#pragma optimization_level n

インテルまたは GCC の解釈のいずれかを適用します。適用される解釈は、-pragma-optimization-level オプションに渡される引数によって決まります。

Windows* の場合、プラグマにはインテルの解釈 (次の関数のみに適用) が常に使用されます。

全般的な動作

インテルの解釈のプラグマを使用すると、特定の関数の最適化レベルを制限し、残りのアプリケーションでは別の高度な最適化レベルを使用して最適化を行うことができます。例えば、アプリケーションに対して -O3 (Linux および Mac OS) を指定し、#pragma optimization_level 1 を指定すると、マークされた関数は -O1 レベルで最適化され、残りのアプリケーションはこれよりも高いレベルで最適化されます。次のように、プラグマは適用する関数の直前に配置してください。

#pragma intel optimization_level 1

gamma() {

...

}

GCC の解釈を使用する場合は、適用する関数の前であればどこに配置しても構いません。

一般に、プラグマは n によって指定されたレベルで関数を最適化しますが、プロシージャー間の最適化 (IPO) など一部のコンパイラーの最適化は、変換単位のコンパイル時に有効または無効になりません。例えば、IPO と特定の最適化レベルを有効にすると、IPO は このプラグマのターゲット関数に対しても有効になります。ただし、コマンドラインで指定された最適化レベルに関係なく、IPO は完全には実装されない場合もあります。また、その逆も起こります。