Klauzule omezení (C++ AMP)
Specifikátor omezení lze použít pro funkce a deklarace lambda.Vynucuje omezení kódu ve funkci a chování funkce v aplikacích používajících modul runtime C++ Accelerated Massive Parallelism (C++ AMP).
[!POZNÁMKA]
Informace o klíčovém slově restrict, které je součástí atributů třídy úložiště __declspec, naleznete v tématu restrict.
Klauzule restrict může mít následující tvary:
Klauzule |
Description |
---|---|
restrict(cpu) |
Funkce může využívat celý jazyk C++.Funkci mohou volat pouze jiné funkce deklarované pomocí funkcí restrict(cpu). |
restrict(amp) |
Funkce může používat pouze tu podmnožinu jazyka C++, kterou může knihovna C++ AMP urychlit. |
Sekvence specifikátorů restrict(cpu) a restrict(amp). |
Funkce musí dodržovat omezení specifikátoru restrict(cpu) i restrict(amp).Funkci lze zavolat funkcemi deklarovanými se specifikátory restrict(cpu), restrict(amp), restrict(cpu, amp) nebo restrict(amp, cpu). Tvar restrict(A) restrict(B) lze zapsat jako restrict(A,B). |
Poznámky
Klíčové slovo restrict je kontextovým klíčovým slovem.Specifikátory omezení cpu a amp nejsou vyhrazenými slovy.Seznam specifikátorů nelze rozšířit.Funkce neobsahující klauzuli restrict je shodná s funkcí obsahující klauzuli restrict(cpu).
Funkce obsahující klauzuli restrict(amp) má následující omezení:
Funkce může volat pouze funkce obsahující klauzuli restrict(amp).
Funkci musí být možné vložit.
Funkce může deklarovat pouze proměnné typu int, unsigned int, float a double a třídy a struktury obsahující pouze tyto typy.Typ bool je povolen také, pro použití ve složeném typu však musí být zarovnán na 4 bajty.
Funkce lambda nedokáží zachytit ukazatele a hodnoty dle reference.
Reference a ukazatele jedné dereference jsou podporovány pouze jako místní proměnné, argumenty funkce a návratové typy.
Následující položky nejsou povoleny:
Rekurze.
Proměnné deklarované s klíčovým slovem volatile.
Virtuální funkce.
Ukazatelé na funkce.
Ukazatele na členské funkce.
Ukazatele ve strukturách.
Ukazatele na ukazatele.
Příkazy goto.
Příkazy s popiskem.
Příkazy try, catch nebo throw.
Globální proměnné
Statické proměnné.Jako náhradu použijte tile_static klíčové slovo.
Přetypování dynamic_cast.
Operátor typeid.
Deklarace asm.
Argumenty vararg.
Diskuzi o omezeních funkcí naleznete v tématu Omezení restrict(amp).
Příklad
Následující příklad ukazuje způsob použití klauzule 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();
}