The restrict type qualifier may only be applied to a
pointer. A pointer declaration that uses this type qualifier
establishes a special association between the pointer and the object it
accesses, making that pointer and expressions based on that pointer, the only
ways to directly or indirectly access the value of that object.
A pointer is the address of a location in memory. More than one pointer can access the same chunk of memory and modify it during the course of a program. The restrict type qualifier is an indication to the compiler that, if the memory addressed by the restrict-qualified pointer is modified, no other pointer will access that same memory. The compiler may choose to optimize code involving restrict-qualified pointers in a way that might otherwise result in incorrect behavior. It is the responsibility of the programmer to ensure that restrict-qualified pointers are used as they were intended to be used. Otherwise, undefined behavior may result.
If a particular chunk of memory is not modified, it can be aliased through more than one restricted pointer.
The following example shows restricted pointers as parameters of foo(), and how an unmodified object can be aliased through two restricted pointers.
void foo(int n, int * restrict a, int * restrict b, int * restrict c) { int i; for (i = 0; i < n; i++) a[i] = b[i] + c[i]; }
Assignments between restricted pointers are limited, and no distinction is made between a function call and an equivalent nested block.
{ int * restrict x; int * restrict y; x = y; // undefined { int * restrict x1 = x; // okay int * restrict y1 = y; // okay x = y1; // undefined } }
In nested blocks containing restricted pointers, only assignments of restricted pointers from outer to inner blocks are allowed. The exception is when the block in which the restricted pointer is declared finishes execution. At that point in the program, the value of the restricted pointer can be carried out of the block in which it was declared.
C++ supports the restrict keyword as a non-orthogonal language
extension for compatibility with C99. The compiler consumes and ignores
the keyword, but issues a diagnostic message for incorrect usage. It is
non-orthogonal because an existing C++ program can use restrict as
a variable name.
Related References