__assume

Microsoft 特定的

傳遞提示給最佳化程式。

語法

__assume(
   expression
)

參數

expression
針對可連線的程式碼,任何假設評估為 true 的運算式。 使用 0 來向優化器指出無法連線的程式碼。

備註

優化器假設 所 expression 表示的條件是在 true 關鍵字出現且在修改之前 expression 維持 true 的點(例如,指派給變數)。 選擇性使用 __assume 傳遞給最佳化程式的提示,可以改善最佳化。

__assume如果語句是以矛盾形式撰寫(一律評估 false 為 的運算式),則一律會被視為 __assume(0) 。 如果您的程式碼未如預期般運作,請確定 expression 您定義的 有效 和 true ,如先前所述。 __assume(0) 陳述式是特殊的情況。 使用 __assume(0) 表示無法連線到的程式碼路徑。

警告

程式不能在可到達的路徑上包含無效的 __assume 陳述式。 如果編譯器可以到達無效的 __assume 陳述式,程式可能會導致無法預期且有潛在危險的行為。

為了與舊版相容, _assume 除非指定編譯器選項 /Za (停用語言延伸模組), 否則 是 的 __assume 同義字。

__assume 不是真正的內在。 它不需要宣告為函式,也不能在 指示詞中使用 #pragma intrinsic 。 雖然不會產生程式碼,但最佳化程式所產生的程式碼會受到影響。

ASSERT只有在判斷提示無法復原時才使用 __assume 。 請勿在具有後續錯誤復原碼的判斷提示中使用 __assume ,因為編譯器可能會將錯誤處理常式代碼優化。

需求

內建 架構
__assume x86、ARM、x64、ARM64、ARM64EC

範例

下列範例示範如何使用 __assume(0) 來指出 default 無法連線到 語句的 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) ,編譯器不會產生程式碼,以測試是否有 p 在 case 語句中未表示的值。

如果您不確定運算式一律在 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;

END Microsoft 特定的

另請參閱

編譯器內建函式
關鍵字