添加到 C99 中的关键字的主要用途之一restrict
是允许编译器将某些内容加载到寄存器中,并假设该寄存器将镜像由此加载的变量的状态。给定
void foo1(int * restrict a, int * restrict b) {
(*a)++; (*b)++; (*b)+=(*a);
}
编译器有权假设写入(*b)
不会受到影响(*a)
,从而避免(*a)
在它之后重新加载。restrict
对混叠有任何其他影响吗?例如,给定:
extern void foo2a(int * restrict q);
extern void foo2b(void);
int x;
int foo2(restrict int *q) {
int z=x;
x++; *q++; x++;
foo2a(&z);
x++; *q++; z++;
foo2b();
x++; *q++; z++;
return x+(*q)+z;
}
编译器是否需要预测 的增量,以及对and*q
的调用都可能受到干扰,并且调用可能对and的值“感兴趣” ?是否需要编译器假设调用可能已经持久化了它的参数——即使它被标记了,这样可以修改?foo2a()
foo2b()
x
x
*q
foo2a()
restrict
foo2b()
z
如果编译器需要在最坏情况的假设下运行,尽管有restrict
关键字,是否有任何方法可以授予编译器权限以忽略在函数调用之前存储对某些变量的任何更改并在下次重新加载它的任何正常义务需要吗?