间而言之,restrict关键字修饰一个指针,并告诉编译器,它不会和其他指针指向同一个地址,从而让编译器优化代码。
例如,有如下函数签名:
int foo(int *a, int *b);
通常,a和b指向不一样的地址,但也是有可能指向一样的地址。那么对于这样的代码:
int foo(int *a, int *b)
{
*a = 5;
*b = 6;
int m = *a + *b;
return m;
}
m可能是11,也可能是12。
这时候编译器会确保每次解引用操作都执行,以得到正确的结果。
如果对指针加上restrict修饰,那么就会告知编译器,这两个地址不会一致,从而提升生成指令的性能。
但这个不一致性就交给程序员去保证,如果没有遵守这项契约,结果是为定义的。
也就是
int foo(int * restrict a, int * restrict b);
这样声明后,程序员需要保证函数调用时,a和b指向不一样的地址。