__restrict
Like the restrict __declspec modifier, the __restrict keyword indicates that a symbol is not aliased in the current scope. The __restrict keyword differs from the restrict __declspec modifier in the following ways:
The __restrict keyword is valid only on variables, and __declspec(restrict) is only valid on function declarations and definitions.
When __restrict is used, the compiler will not propagate the no-alias property of a variable. That is, if you assign a __restrict variable to a non-__restrict variable, the compiler will not imply that the non-__restrict variable is not aliased.
Generally, if you affect the behavior of an entire function, it is better to use the __declspec than the keyword.
__restrict is similar to restrict from the C99 spec, but __restrict can be used in C++ or C programs.
There is no support for __restrict on C++ references.
Note
When used on a variable that also has the volatile (C++) keyword, volatile will take precedence.
Example
// __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;
};