Sdílet prostřednictvím


__assume

Specifické pro Microsoft

Předá nápovědu optimalizace.

__assume(    expression )

Parametry

  • expression
    Libovolný výraz, který předpokládá se, že vyhodnotit na hodnotu true.

Poznámky

Okně Optimalizace předpokládá, že podmínka reprezentována expression má hodnotu true v místě, kde se zobrazí klíčové slovo a zůstane až do true expression je upraven (například pomocí přiřazení k proměnné).Selektivní použití poznámek předán optimalizace podle __assume lze vylepšit optimalizace.

Pokud __assume prohlášení je zapsán jako v rozporu (výraz, který vždy vyhodnocen jako false), je vždy považovány za __assume(0).Pokud váš kód není fungují podle očekávání, ujistěte se, zda expression je definován je platný a je hodnota true, jak bylo popsáno výše.Další informace o očekáván __assume(0) chování, podívejte se na téma novější poznámky.

Poznámka k upozorněníUpozornění

Program nesmí obsahovat neplatný __assume prohlášení na dosažitelný cestě.Pokud kompilátor může dosáhnout neplatný __assume prohlášení, program může způsobit neočekávané a potenciálně nebezpečné chování.

__assumenení podstatný vnitřní.Nemá být deklarována jako funkce a nelze jej použít v #pragma intrinsic direktivu.Ačkoli žádný kód je vygenerován jen tehdy, je ovlivněn kód generovaný okně Optimalizace.

Použití __assume v vyhodnocení pouze při vyhodnocení není obnovitelných.Nepoužívejte __assume v vyhodnocení u níž máte kód obnovení následné chyby vzhledem k tomu, že kompilátor může ihned optimalizovat kód pro zpracování chyb.

__assume(0) Prohlášení je zvláštním případem.Použití __assume(0) označíte cesta kódu, který nelze získat přístup.Následující příklad ukazuje, jak používat __assume(0) označuje, že nelze získat přístup v případě výchozího příkazu switch.Tato hodnota udává nejvíce typické použití __assume(0).

Požadavky

Vnitřní

Architektura

__assume

x 86, ARM,x64

Příklad

// compiler_intrinsics__assume.cpp
#ifdef DEBUG
# define ASSERT(e)    ( ((e) || assert(__FILE__, __LINE__) )
#else
# define ASSERT(e)    ( __assume(e) )
#endif

void func1(int i)
{
}

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.
   }
}

Použití __assume(0) okně Optimalizace určí, zda výchozím případě nelze získat přístup.Tento příklad ukazuje, že programátora informaci o tom, že je možné pouze vstupů pro p bude 1 nebo 2.Pokud jiná hodnota předaná p, program se stane neplatným a způsobí, že nepředvídatelně.

Na základě těchto __assume(0) prohlášení, kompilátor negeneruje kód pro testování zda p má hodnotu, která není v příkazu case reprezentována.Pro tento postup __assume(0) příkaz musí být první příkaz v datové části výchozí případu.

Vzhledem k tomu, že kompilátor generuje kód na základě __assume, že kód nefunguje správně, pokud výraz v rámci __assume v době běhu je hodnota false prohlášení.Pokud si nejste jisti, že výraz budete mít vždy hodnotu true v době běhu, můžete použít assert funkce k ochraně kódu.

#define ASSERT(e)    ( ((e) || assert(__FILE__, __LINE__)), __assume(e) )

Bohužel toto použití assert brání kompilátor provádět optimalizace výchozí případ, který byl popsán dříve v tomto dokumentu.Alternativně můžete samostatné makra následujícím způsobem.

#ifdef DEBUG
# define NODEFAULT   ASSERT(0)
#else
# define NODEFAULT   __assume(0)
#endif

   default:
      NODEFAULT;

Viz také

Referenční dokumentace

Vnitřní funkce kompilátoru

Klíčová slova jazyka C++