Dieser Artikel wurde maschinell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen.
Übersetzung
Original
Dieser Artikel wurde noch nicht bewertet - Dieses Thema bewerten.

__assume

[Diese Dokumentation ist nur eine Vorschau und wird in späteren Versionen ggf. geändert. Blank topics are included as placeholders.]

Microsoft-spezifisch

Übergibt einen Hinweis für den Optimierer.


          
__assume(
   expression
)
        
expression

Ein beliebiger Ausdruck, der verwendet wird, um auf true ergibt.

Der Optimierer wird davon ausgegangen, dass die Bedingung, die durch expression dargestellte Punkt den Wert true hat, in dem das Schlüsselwort true aussieht und bleibt, bis expression geändert wurde, beispielsweise durch Zuweisung zu einer Variablen). Selektiver Verwendung von Hinweisen, die für den Optimierer nach __assume übergeben werden, kann die Optimierung verbessert werden.

Warnhinweis Vorsicht

Ein Programm darf eine ungültige __assume-Anweisung in einen erreichbaren Pfad enthalten. Wenn der Compiler eine ungültige __assume-Anweisung zugreifen kann, führt das Programm möglicherweise gefährliches und unvorhersehbaren Verhalten führen.

__assume ist kein originales systeminternes. Sie muss nicht deklariert werden, da eine Funktion und sie nicht in #pragma intrinsic-Direktive verwendet werden können. Kein Code generiert wird, obwohl der Code, der vom Optimierer generiert wird, beeinflusst wird.

Verwenden Sie __assume in ASSERT nur, wenn die Assertion nicht wiederherstellbar sind. Verwenden Sie keine __assume in einer Assertion, für die Sie den folgenden Code Fehlerbehebungs aufweisen, da der Compiler möglicherweise außerhalb der optimierte Code zur Fehlerbehandlung.

Die __assume(0)-Anweisung ist ein Sonderfall. Verwenden Sie __assume(0) , um einen Codepfad anzugeben, der nicht erreicht werden kann. Im folgenden Beispiel wird gezeigt, wie __assume(0) verwendet, um anzugeben, dass der Groß-/Kleinschreibung einer switch-Anweisung nicht erreicht werden kann. Dies ist die gängigste Verwendung von __assume(0).

Intrinsisch

Architektur

__assume

x86, IPF, x64

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

Die Verwendung von __assume(0) weist den Optimierer an, dass der Standardwert Groß-/Kleinschreibung nicht erreicht werden kann. Das Beispiel zeigt, dass der Programmierer weiß, dass die einzigen möglichen Eingaben für p 1 oder 2 ist. Wenn ein anderer Wert für pübergeben wird, wird das Programm ungültig und bewirkt unvorhersehbaren Verhaltens.

Aufgrund der __assume(0)-Anweisung generiert der Compiler keinen Code, um zu testen, ob p über einen Wert verfügt, der nicht in einer case-Anweisung dargestellt wird. Damit dies, die __assume(0)-Anweisung muss die erste Anweisung im Text des standardmäßigen Groß-/Kleinschreibung sein.

Da der Compiler Code auf der Grundlage __assumegeneriert, kann dieser Code nicht ordnungsgemäß ausgeführt, wenn der Ausdruck in der __assume-Anweisung zur Laufzeit falsch ist. Wenn Sie nicht sicher sind, dass der Ausdruck immer true während der Laufzeit ist, können Sie die assert-Funktion verwenden, um den Code zu schützen.

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

Leider verhindert diese Verwendung von assert , dass der Compiler die DEFAULT CASE-Optimierung ausführt, die oben in diesem Dokument beschrieben wurde. Alternativ können Sie ein separates Makros wie folgt.

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

   default:
      NODEFAULT;
Fanden Sie dies hilfreich?
(1500 verbleibende Zeichen)
© 2013 Microsoft. Alle Rechte vorbehalten.