函数的限制限定指针参数是允许编译器优化that function:
int f(const int *restrict p) {
int n=*p;
printf("Debug\n");
return *p==n;
}
在这里,带有-03的Clang 17将只返回1,而不重新判断*p
,也不执行比较.
如果没有restrict
,则必须重新判断*p
,并进行比较.这是因为printf
是一个外部函数,编译器不知道它是否会修改*p
.实际上,如果p
恰好指向文件位置指示符stdout
,则printf
实际上要修改它.
因此,作为一般原则,如果您希望最大限度地优化the function,并且您的函数曾经调用过外部函数,则声明所有参数restrict
并不是没有意义的.当然,这对调用者施加了严格的限制,因为它要求调用者promise 不会使用指向意外位置的别名指针来调用您的函数.
我的问题比这个观察更深入.我问restrict
是不是也可以优化the callers of your function?
int f(const int *restrict p);
int caller(int *p) {
int n=*p;
f(p);
return *p==n;
}
在我看来,这似乎向编译器保证了f
不会修改*p
,因此它可以省略重新判断*p
和比较,并且可以安全地返回1.Clang和GCC都不做这种优化.
我知道他们不优化调用者是可以的.我问的是,是否允许对其进行优化.(这主要是关于程序的语义的问题,而不是关于性能的问题.)