__restrict
Like the __declspec
( restrict
) modifier, the __restrict
keyword (two leading underscores '_') indicates that a symbol isn't aliased in the current scope. The __restrict
keyword differs from the __declspec (restrict)
modifier in the following ways:
The
__restrict
keyword is valid only on variables, and__declspec (restrict)
is only valid on function declarations and definitions.__restrict
is similar torestrict
for C starting in C99 and available in/std:c11
or/std:c17
mode, but__restrict
can be used in both C++ and C programs.When
__restrict
is used, the compiler won't propagate the no-alias property of a variable. That is, if you assign a__restrict
variable to a non-__restrict
variable, the compiler will still allow the non-__restrict variable to be aliased. This is different from the behavior of the C99 C languagerestrict
keyword.
Generally, if you want to affect the behavior of an entire function, use __declspec (restrict)
instead of the keyword.
For compatibility with previous versions, _restrict
is a synonym for __restrict
unless compiler option /Za
(Disable language extensions) is specified.
In Visual Studio 2015 and later, __restrict
can be used on C++ references.
Note
When used on a variable that also has the volatile
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;
};