__restrict
Come il modificatore restrict __declspec, la __restrict parola chiave indica che per un simbolo non viene utilizzato un alias nell'ambito corrente. Tra la parola chiave __restrict e il modificatore restrict __declspec esistono le differenze seguenti:
La parola chiave __restrict è valida solo per variabili, mentre __declspec(restrict) è valido solo per le dichiarazioni e le definizioni di funzione.
Quando si utilizza __restrict, il compilatore non trasferirà la proprietà noalias di una variabile. In altre parole, se si assegna una variabile __restrict a una variabile non-__restrict, per il compilatore non è implicito che per la variabile non-__restrict non venga utilizzato un alias. Questo comportamento è diverso da quello della parola chiave restrict della specifica C99.
In generale, se si è interessati al comportamento di un'intera funzione, è preferibile utilizzare __declspec anziché la parola chiave.
__restrict è analogo a restrict nella specifica C99, ma è possibile utilizzare __restrict in programmi C++ o C.
Nei riferimenti C++ non è presente alcun supporto per __restrict.
Nota
Se utilizzato in una variabile cui è associata la parola chiave volatile (C++), volatile avrà la precedenza.
Esempio
// __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;
};