__assume
Microsoft 固有の仕様
オプティマイザーにヒントを渡します。
構文
__assume(
expression
)
パラメーター
expression
到達可能なコードの場合、評価 true
対象と見なされる任意の式。 オプティマイザーに到達できないコードを示すために使用 0
します。
解説
オプティマイザーは、表されるexpression
条件がtrue
、キーワード (keyword)が表示され、変更されるまでexpression
は true メイン再メインであると見なします (変数への代入など)。 __assume
がオプティマイザーに渡すヒントを選択的に使用することで、より優れた最適化を行うことができます。
ステートメントが __assume
矛盾として記述されている場合 (常に評価 false
される式) __assume(0)
、常に . コードが期待どおりに動作しない場合は、前に説明したように、定義した expression
コードが有効 true
であることを確認します。 __assume(0)
このステートメントは特殊なケースです。 到達できないコード パスを示すために使用 __assume(0)
します。
警告
プログラムの到達可能なパスには、無効な __assume
ステートメントを含めないでください。 コンパイラが無効な __assume
ステートメントに到達することがあると、予測できない、悪影響のある動作がプログラムで発生するおそれがあります。
以前のバージョンとの互換性を確保するために、_assume
は、コンパイラ オプション /Za
(言語拡張機能の無効化) が指定されていない限り、__assume
の同意語です。
__assume
は本物の組み込みではありません。 関数として宣言する必要はありません。ディレクティブでは #pragma intrinsic
使用できません。 コードは生成されませんが、オプティマイザーが生成するコードには影響を与えます。
アサーションをASSERT
回復できない場合にのみ使用__assume
します。 コンパイラがエラー処理コードを最適化する可能性があるため、後続のエラーリカバリー コードがあるアサーションでは使用__assume
しないでください。
必要条件
Intrinsic | アーキテクチャ |
---|---|
__assume |
x86、ARM、x64、ARM64、ARM64EC |
例
次の例は、ステートメントの大文字と小文字にdefault
到達できないことを示すために使用__assume(0)
する方法をswitch
示しています。 これは、最も一般的な使用です __assume(0)
. ここでは、プログラマは、可能な唯一の入力 p
が 1 または 2 であることを認識しています。 別の値が p
に渡された場合は、プログラムが無効になり予期しない動作が発生します。
// compiler_intrinsics__assume.cpp
void func1(int /*ignored*/)
{
}
int main(int p)
{
switch(p)
{
case 1:
func1(1);
break;
case 2:
func1(-1);
break;
default:
__assume(0);
// This tells the optimizer that the default
// cannot be reached. As so, it does not have to generate
// the extra code to check that 'p' has a value
// not represented by a case arm. This makes the switch
// run faster.
}
}
ステートメントの __assume(0)
結果として、コンパイラは case ステートメントで表されていない値を持っているかどうかを p
テストするコードを生成しません。
式が常に true
実行時になるかどうかわからない場合は、関数を assert
使用してコードを保護できます。 このマクロ定義は、ステートメントを__assume
チェックでラップします。
#define ASSUME(e) (((e) || (assert(e), (e))), __assume(e))
ケースの最適化を default
機能させるには、ステートメントが __assume(0)
ケース本体の最初の default
ステートメントである必要があります。 残念ながら、 assert
マクロ内 ASSUME
では、コンパイラがこの最適化を実行できなくなります。 別の方法として、次に示すように、別のマクロを使用できます。
#ifdef DEBUG
// This code is supposed to be unreachable, so assert
# define NODEFAULT assert(0)
#else
# define NODEFAULT __assume(0)
#endif
// . . .
default:
NODEFAULT;
Microsoft 固有の仕様はここまで
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示