ograniczenie (C++ AMP)

Specyfikator ograniczenia może być stosowany do funkcji i deklaracji lambda. Wymusza on ograniczenia dotyczące kodu w funkcji i zachowania funkcji w zastosowaniach, które korzystają ze środowiska uruchomieniowego C++ Accelerated Massive Parallelism (C++ AMP).

Uwaga

Aby uzyskać informacje o słowie restrict kluczowym, które jest częścią __declspec atrybutów klasy magazynu, zobacz ograniczanie.

Klauzula restrict przyjmuje następujące formy:

Klauzula opis
restrict(cpu) Funkcja może używać w pełni języka C++. Tylko inne funkcje, które są zadeklarowane za pomocą funkcji restrict(cpu) mogą wywołać tę funkcję.
restrict(amp) Funkcja może używać tylko podzbioru języka C++, który może być przyspieszony przez C++ AMP.
Sekwencja restrict(cpu) i restrict(amp). Funkcja musi stosować się do ograniczeń zarówno restrict(cpu), jak i restrict(amp). Funkcja może być wywołana przez funkcje, które są zadeklarowane przy użyciu restrict(cpu), restrict(amp), restrict(cpu, amp) lub restrict(amp, cpu).

Postać restrict(A) restrict(B) może być zapisana jako restrict(A,B).

Uwagi

Słowo restrict kluczowe jest kontekstowym słowem kluczowym. Specyfikatory ograniczeń cpu i amp nie są słowami zarezerwowanymi. Lista specyfikatorów nie jest rozszerzalna. Funkcja, która nie ma klauzuli restrict , jest taka sama jak funkcja, która ma klauzulę restrict(cpu) .

Funkcja z klauzulą restrict(amp) ma następujące ograniczenia:

  • Funkcja może wywołać tylko funkcje z klauzulą restrict(amp).

  • Funkcja musi być możliwa do wbudowania.

  • Funkcja może deklarować tylko intzmienne , unsigned int, floati double oraz klasy i struktury, które zawierają tylko te typy. bool jest również dozwolone, ale musi być wyrównany 4-bajtowy, jeśli używasz go w typie złożonym.

  • Funkcje lambda nie mogą przechwytywać poprzez odwołanie i nie mogą przechwytywać wskaźników.

  • Odwołania i wskaźniki pojedynczego pośrednictwa są obsługiwane tylko jako zmienne lokalne, argumenty funkcji i typy zwracane.

  • Nie są dozwolone:

    • Rekursja.

    • Zmienne zadeklarowane za pomocą słowa kluczowego volatile .

    • Funkcje wirtualne.

    • Wskaźniki do funkcji.

    • Wskaźniki do funkcji członkowskich.

    • Wskaźniki w strukturach.

    • Wskaźniki do wskaźników.

    • goto Instrukcji.

    • Instrukcje oznaczone.

    • try, , catchlub throw instrukcje.

    • Zmienne globalne.

    • Zmienne statyczne. Zamiast tego użyj słowa kluczowego tile_static.

    • dynamic_cast Rzuca.

    • Operator typeid.

    • Deklaracje asm.

    • Elementy vararg.

Aby zapoznać się z omówieniem ograniczeń funkcji, zobacz ograniczenia ograniczeń(amp).

Przykład

W poniższym przykładzie pokazano, jak używać klauzuli restrict(amp).

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();
}

Zobacz też

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