Udostępnij za pośrednictwem


__assume

Specyficzne dla firmy Microsoft

Przekazuje wskazówkę do Optymalizator.

__assume(    expression )

Parametry

  • expression
    Dowolne wyrażenie przyjęto, że do oceny na wartość true.

Uwagi

Optymalizator przyjęto, że stan, który jest reprezentowany przez expression ma wartość true w miejscu, w którym słowo kluczowe pojawia się i pozostaje true aż do expression jest zmodyfikowany (na przykład przypisania do zmiennej).Selektywnego użycia wskazówek przekazany do Optymalizator przez __assume może poprawić optymalizacji.

Jeśli __assume instrukcja jest zapisywana jako sprzeczności (wyrażeniem zawsze FALSE), zawsze jest traktowana jako __assume(0).Jeśli zgodnie z oczekiwaniami, która nie jest kodu, upewnij się, że expression zostanie zdefiniowany jest prawidłowy i ma wartość true, w sposób opisany wcześniej.Aby uzyskać więcej informacji na temat Oczekiwano __assume(0) zachowanie, zobacz uwagi później.

Informacje dotyczące przestrogiPrzestroga

Program nie może zawierać nieprawidłową __assume instrukcji na ścieżce osiągalny.Jeśli kompilator nawiązać połączenie z nieprawidłową __assume instrukcję, program może spowodować powstanie nieprzewidywalnego i potencjalnie niebezpieczne zachowanie.

__assumenie jest oryginalna wewnętrznych.Nie musi być zadeklarowany jako funkcji i nie można używać w #pragma intrinsic dyrektywy.Chociaż nie kod został wygenerowany, kod wygenerowany przez optymalizator ma wpływ.

Użyj __assume w potwierdzenia tylko wtedy, gdy potwierdzenia nie jest możliwość odzyskania.Nie używaj __assume w potwierdzenia, dla którego ma kod odzyskiwania kolejnych błędów, ponieważ kompilator może optymalizacji między kodu obsługi błędów.

__assume(0) Instrukcja jest specjalny przypadek.Użyj __assume(0) Jeśli ścieżka kodu, których nie można osiągnąć.Poniższy przykład przedstawia sposób użycia __assume(0) do wskazania domyślną wielkość liter przełącznika instrukcji nie można uzyskać dostępu.Pokazuje to najbardziej typowe korzystanie z __assume(0).

Wymagania

Wewnętrzne

Architektura

__assume

x 86, ARM,x64

Przykład

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

Korzystanie z __assume(0) informuje Optymalizator nie można osiągnąć domyślną wielkość liter.W przykładzie pokazano programisty wie, że możliwe tylko wejść dla p będzie 1 lub 2.Jeśli został przekazany inną wartość p, program może stracić ważność i powoduje, że nieprzewidywalnego zachowania.

W __assume(0) instrukcję, kompilator nie generuje kod do przetestowania czy p ma wartość, która nie jest uwzględniona w instrukcji case.Aby to zrobić __assume(0) instrukcja musi być pierwszą instrukcją w treści domyślną wielkość liter.

Ponieważ kompilator generuje kod na podstawie __assume, czy kod może nie działać prawidłowo, jeśli wyrażenie wewnątrz __assume instrukcji ma wartość false w czasie wykonywania.Jeśli nie masz pewności, że wyrażenie będzie zawsze true w czasie wykonywania, można użyć assert funkcji Ochrona kodu.

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

Niestety, ta korzystanie z assert zapobiega wykonywaniu optymalizacji przypadku domyślnym, które zostało opisane wcześniej w tym dokumencie przez kompilator.Alternatywnie można użyć osobnej makra, w następujący sposób.

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

   default:
      NODEFAULT;

Zobacz też

Informacje

Funkcje wewnętrzne kompilatora

Słowa kluczowe języka C++