__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 特定的