restrict (C++ AMP)

Der Einschränkungsspezifizierer kann auf Funktions- und Lambda-Deklarationen angewendet werden. Er erzwingt Einschränkungen für den Code in der Funktion und das Verhalten der Funktion in Anwendungen, die C++ Accelerated Massive Parallelism(C++ AMP)-Laufzeit verwenden.

Hinweis

Informationen zu den restrict Schlüsselwort (keyword), die Teil der Attribute der __declspec Speicherklasse sind, finden Sie unter Restrict.

Die restrict Klausel verwendet die folgenden Formen:

Klausel Beschreibung
restrict(cpu) Die Funktion kann die vollständige C++-Programmiersprache verwenden. Es können nur andere Funktionen, die durch die Verwendung von restrict(cpu)-Funktionen deklariert werden, die Funktion aufrufen.
restrict(amp) Die Funktion kann nur die Teilmenge der Programmiersprache C++ verwenden, die mit C++ AMP beschleunigt werden kann.
Eine Sequenz von restrict(cpu) und restrict(amp). Die Funktion muss den Einschränkungen von restrict(cpu) und restrict(amp) folgen. Die Funktion kann von Funktionen aufgerufen werden, die durch die Verwendung von restrict(cpu), restrict(amp), restrict(cpu, amp) oder restrict(amp, cpu) deklariert werden.

Das Formular restrict(A) restrict(B) kann als restrict(A,B) geschrieben werden.

Hinweise

Die restrict Schlüsselwort (keyword) ist eine kontextbezogene Schlüsselwort (keyword). Die Einschränkungsspezifizierer, cpu und amp sind keine reservierten Wörter. Die Liste der Spezifizierer ist nicht erweiterbar. Eine Funktion, die nicht über eine restrict Klausel verfügt, ist identisch mit einer Funktion, die die restrict(cpu) Klausel enthält.

Eine Funktion, die über die restrict(amp)-Klausel verfügt, hat folgende Einschränkungen:

  • Die Funktion kann nur Funktionen aufrufen, die die restrict(amp)-Klausel enthalten.

  • Die Funktion muss inlinable sein.

  • Die Funktion kann nur intKlassen unsigned intfloatund Strukturen deklarieren, die double nur diese Typen enthalten. bool ist auch zulässig, muss jedoch 4-Byte ausgerichtet sein, wenn Sie es in einem Verbundtyp verwenden.

  • Lambda-Funktionen können nicht als Verweis erfassten und können keine Zeiger erfassen.

  • Verweise und Einzeldereferenzierungszeiger werden nur als lokale Variablen, Funktionsargumente und Rückgabetypen unterstützt.

  • Folgendes ist nicht zulässig:

    • Rekursion.

    • Variablen, die mit der veränderliche Schlüsselwort (keyword) deklariert wurden.

    • Virtuelle Funktionen.

    • Zeiger auf Funktionen.

    • Zeiger auf die Memberfunktionen.

    • Zeiger in Strukturen.

    • Zeiger auf Zeiger.

    • goto -Anweisungen.

    • Anweisungen mit Bezeichnung.

    • try, catchoder throw Anweisungen.

    • Globale Variablen.

    • Statische Variablen. Verwenden Sie stattdessen tile_static Schlüsselwort .

    • dynamic_cast Wirft.

    • Der Operator typeid.

    • ASM-Deklarationen.

    • Varargs.

Eine Erläuterung der Funktionsbeschränkungen finden Sie unter restrict(amp)restrictions.

Beispiel

Das folgende Beispiel zeigt, wie die restrict(amp)Klausel verwendet wird.

void functionAmp() restrict(amp) {}
void functionNonAmp() {}

void callFunctions() restrict(amp)
{
    // int is allowed.
    int x;
    // long long int is not allowed in an amp-restricted function. This generates a compiler error.
    // long long int y;

    // Calling an amp-restricted function is allowed.
    functionAmp();

    // Calling a non-amp-restricted function is not allowed.
    // functionNonAmp();
}

Siehe auch

C++ AMP (C++ Accelerated Massive Parallelism)