I'm having quite hard time making proper usage of restrict
keyword in C. I wrote this function to in-place reverse a string:
void my_strrev(char *restrict str, const size_t len) {
char *restrict strr = str + len - 1;
char temp;
while (str < strr) {
temp = *str;
*str++ = *strr;
*strr-- = temp;
}
}
Here, although both str
and strr
are pointing to same array, I'm using those pointers to access individual characters, and they never point to same characters. Hence I think this is a proper use of restrict
. Also I got expected output when I run this program with few sample inputs. But I'm unsure of my usage of restrict
. So, please correct me if I'm doing wrong.
restrict
has pretty much one single use - a contract that the programmer signs up with the compiler saying "I promise that I won't pass parameters pointing at the same data to this function with external linkage." This is still to this day mostly based on the compiler trusting the programmer, rather than the compiler giving diagnostic messages when the programmer "breaks the contract".
If the compiler can assume that the programmer kept their side of the bargain, it can make optimizations:
memcpy
vs memmove
for example.)char*
and an int*
parameter.)Using restrict
for a local pointer variable isn't very meaningful since it doesn't relate to any of the above situations. It will compile but there will be no benefits of using it. As far as I know, no additional diagnostics is currently provided by any of the mainstream compilers, should you use a restrict
pointer inappropriately.