共用方式為


__assume

Microsoft 特定的

傳遞提示給最佳化程式。

語法

__assume(
   expression
)

參數

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

備註

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

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

警告

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

為了與舊版相容,除非指定了編譯器選項 /Za (停用語言延伸模組),否則 _assume__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 特定的

另請參閱

編譯程式內部函數
關鍵字