__restrict
Podobně jako modifikátor restrict __declspec označuje klíčové slovo __restrict skutečnost, že symbol nemá v aktuálním oboru alias.Klíčové slovo __restrict se od modifikátoru restrict __declspec liší následujícími způsoby:
Klíčové slovo __restrict je platné pouze pro proměnné, klíčové slovo __declspec(restrict) je platné pouze pro deklarace a definice funkcí.
Je-li použito klíčové slovo __restrict, kompilátor nebude šířit vlastnost proměnné, že nemá alias.Přiřadíte-li tedy proměnnou s klíčovým slovem __restrict do proměnné bez klíčového slova __restrict, kompilátor absenci aliasu pro proměnnou bez klíčového slova __restrict neprojeví.Zde je rozdíl oproti chování klíčového slova restrict dle specifikace C99.
Obecně je vhodnější při ovlivňování chování celé funkce použít direktivu __declspec než toto klíčové slovo.
Klíčové slovo __restrict se podobá klíčovému slovu restrict dle specifikace C99, slovo __restrict však lze použít v programech jazyka C++ i C.
V odkazech jazyka C++ neexistuje podpora klíčového slova __restrict.
[!POZNÁMKA]
Při použití u proměnné deklarované také s klíčovým slovem volatile (C++), má slovo volatile přednost.
Příklad
// __restrict_keyword.c
// compile with: /LD
// In the following function, declare a and b as disjoint arrays
// but do not have same assurance for c and d.
void sum2(int n, int * __restrict a, int * __restrict b,
int * c, int * d) {
int i;
for (i = 0; i < n; i++) {
a[i] = b[i] + c[i];
c[i] = b[i] + d[i];
}
}
// By marking union members as __restrict, tell compiler that
// only z.x or z.y will be accessed in any given scope.
union z {
int * __restrict x;
double * __restrict y;
};