__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 固有の仕様はここまで

関連項目

コンパイラの組み込み
キーワード