Sdílet prostřednictvím


__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í falsejako ), 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 truejak 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á pjiná 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. assertASSUME 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

Viz také

Vnitřní funkce kompilátoru
Klíčová slova