__assume

[このドキュメントはプレビュー版であり、後のリリースで変更されることがあります。 Blank topics are included as placeholders.]

Microsoft 固有の仕様 →

オプティマイザーにヒントを渡します。

__assume(
   expression
)

パラメーター

  • expression
    true と評価されると仮定される式。

解説

オプティマイザーで expression で表される条件が true のキーワードなどexpression が変更されるまで位置にある true と想定しています (変数への代入によって)。 __assume がオプティマイザーに渡される情報の選択的には最適化が向上します。

注意

プログラムにアクセス可能ファイルのパス __assume の無効なステートメントを含めることはできません。コンパイラが __assume の無効なステートメントに到達できますがプログラムにより予測できない危険性のある動作が発生します。

__assume は正規の組み込みではありません。 は関数と #pragma intrinsic のディレクティブでは使用できないため宣言する必要はありません。 コードはオプティマイザーによって生成されるコードが影響を受けるが生成されません。

アサートが回復可能な場合にのみ Assert で __assume を使用します。 コンパイラがエラー処理コードを最適化する可能性があるため後続のエラー回復コードを含むアサートに __assume を使用しないでください。

__assume(0) のステートメントは特殊なケースです。 到達できないコード パスを示すために __assume(0) を使用します。 次の例ではswitch ステートメントを既定の設定に到達できないことを示すために __assume(0) を使用する方法を示します。 これは __assume(0) の最も一般的な方法です。

必要条件

組み込み

アーキテクチャ

__assume

x86IPFx64

使用例

// compiler_intrinsics__assume.cpp
#ifdef DEBUG
# define ASSERT(e)    ( ((e) || assert(__FILE__, __LINE__) )
#else
# define ASSERT(e)    ( __assume(e) )
#endif

void func1(int i)
{
}

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) の使用は既定の設定に到達できないことをに通知します。 この例では p の正しい入力が 1 または 2. であることをプログラマが認識できることを示しています。 別の値が p としてを渡すとプログラムは無効になり予期しない動作が発生します。

__assume(0) のステートメントの結果コンパイラは p ケースで表されないステートメントに値が存在するかどうかをテストするコードを生成しません。 これに __assume(0) のステートメントは既定の文字種の本体の最初のステートメントである必要があります。

コンパイラが __assume に基づいてコードが生成されるためコードは __assume のステートメント内の式が実行時に false の場合正しく動作しないことがあります。 式は実行時に常に True であることを確認してコードを保護するに assert の関数を使用します。

# define ASSERT(e)    ( ((e) || assert(__FILE__, __LINE__)), __assume(e) )

ただしこの assert の使用はコンパイラがこのドキュメントで既に説明した既定の文字種の最適化を実行することはできません。 または次のように別のマクロを使用します。

#ifdef DEBUG
# define NODEFAULT   ASSERT(0)
#else
# define NODEFAULT   __assume(0)
#endif

   default:
      NODEFAULT;

参照

Reference

コンパイラ組み込み関数。

C++ キーワード