__assume
Specifické pro Microsoft
Předá optimalizátoru nápovědu.
Syntaxe
__assume(
expression
)
Parametry
expression
Pro dosažitelný kód se předpokládá, že se výraz vyhodnotí jako true
. Slouží 0
k označení nedostupného kódu pro optimalizátor.
Poznámky
Optimalizátor předpokládá, že podmínka reprezentovaná expression
je true
v okamžiku, kdy se klíčové slovo zobrazuje a zůstává pravdivé, dokud expression
se nezmění (například přiřazením proměnné). Selektivní použití tipů předaných optimalizátoru může __assume
zlepšit optimalizaci.
__assume
Pokud je prohlášení zapsáno jako rozpor (výraz, který se vždy vyhodnotí false
jako ), je vždy považován za __assume(0)
. Pokud se váš kód chová podle očekávání, ujistěte se, že expression
je definovaný platný a true
jak je popsáno výše. Příkaz __assume(0)
je zvláštní případ. Slouží __assume(0)
k označení cesty kódu, ke které nelze získat přístup.
Upozorňující
Program nesmí obsahovat neplatný __assume
příkaz na dosažitelné cestě. Pokud kompilátor může dosáhnout neplatného __assume
příkazu, může program způsobit nepředvídatelné a potenciálně nebezpečné chování.
Kvůli kompatibilitě s předchozími verzemi _assume
je synonymem, pokud __assume
není zadána možnost /Za
kompilátoru (Zakázat jazyková rozšíření ).
__assume
není originální vnitřní. Nemusí být deklarována jako funkce a nedá se použít v direktivě #pragma intrinsic
. I když není vygenerován žádný kód, je ovlivněn kód vygenerovaný optimalizátorem.
Použít __assume
pouze v ASSERT
případech, kdy kontrolní výraz není možné obnovit. Nepoužívejte __assume
v kontrolním výrazu, pro který máte následný kód obnovení chyby, protože kompilátor může optimalizovat kód zpracování chyb.
Požadavky
Vnitřní | Architektura |
---|---|
__assume |
x86, ARM, x64, ARM64, ARM64EC |
Příklad
Následující příklad ukazuje, jak použít __assume(0)
k označení, že default
případ switch
příkazu nelze dosáhnout. Je to nejtypičtější použití __assume(0)
. Zde programátor ví, že jediný možný vstup pro p
bude 1 nebo 2. Pokud se předá p
jiná hodnota , program se stane neplatným a způsobí nepředvídatelné chování.
// 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.
}
}
V důsledku __assume(0)
příkazu kompilátor negeneruje kód, který otestuje, jestli p
má hodnotu, která není reprezentována v příkazu case.
Pokud si nejste jistí, že výraz bude vždy true
za běhu, můžete pomocí assert
funkce chránit kód. Tato definice makra zabalí __assume
příkaz se kontrolou:
#define ASSUME(e) (((e) || (assert(e), (e))), __assume(e))
default
Aby optimalizace případu fungovala, __assume(0)
musí být příkaz prvním příkazem v těle default
případu. assert
ASSUME
V makru bohužel brání kompilátoru v provedení této optimalizace. Jako alternativu můžete použít samostatné makro, jak je znázorněno tady:
#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 Specific