__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.
Przestroga |
---|
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;