Previous: restrict Pointers, Up: Type Qualifiers [Contents][Index]
restrict
Pointer ExampleHere are examples where restrict
enables real optimization.
In this example, restrict
assures GCC that the array out
points to does not overlap with the array in
points to.
void process_data (const char *in, char * restrict out, size_t size) { for (i = 0; i < size; i++) out[i] = in[i] + in[i + 1]; }
Here’s a simple tree structure, where each tree node holds data of
type PAYLOAD
plus two subtrees.
struct foo { PAYLOAD payload; struct foo *left; struct foo *right; };
Now here’s a function to null out both pointers in the left
subtree.
void null_left (struct foo *a) { a->left->left = NULL; a->left->right = NULL; }
Since *a
and *a->left
have the same data type,
they could legitimately alias (see Aliasing). Therefore,
the compiled code for null_left
must read a->left
again from memory when executing the second assignment statement.
We can enable optimization, so that it does not need to read
a->left
again, by writing null_left
this in a less
obvious way.
void null_left (struct foo *a) { struct foo *b = a->left; b->left = NULL; b->right = NULL; }
A more elegant way to fix this is with restrict
.
void null_left (struct foo *restrict a) { a->left->left = NULL; a->left->right = NULL; }
Declaring a
as restrict
asserts that other pointers such
as a->left
will not point to the same memory space as a
.
Therefore, the memory location a->left->left
cannot be the same
memory as a->left
. Knowing this, the compiled code may avoid
reloading a->left
for the second statement.