Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
int
zmienne ,unsigned int
,float
idouble
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
, ,catch
lubthrow
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();
}