restrict关键字对唯一指针类型的参数没有意义吗?

Tre*_*key 3 c parameter-passing restrict strict-aliasing memory-address

我注意到restrict在我们的一个遗留项目中大量使用了关键字.
我理解其基本原理restrict,但在应用于其中一些功能时,我质疑其有用性.

请看以下两个例子:

void funcA(int *restrict i){
    // ...
}

void funcB(int *restrict i, float *restrict f){
    // ...
}

int main(){

    int i = 1;
    float f = 3.14;

    funcA(&i);
    funcB(&i,&f);
}
Run Code Online (Sandbox Code Playgroud)

有一个可能标记的参数的任何正当理由funcA,并funcBrestrict

funcA只需要1个参数.它怎么能和其他地址一样?

funcB采用不同类型的参数.如果它们是相同的地址,那么这不会破坏严格的别名规则吗?

agh*_*ast 5

restrict关键字是意向声明,为改进优化.这意味着给定指针指向的对象在(在这种情况下)函数参数的生命周期中不会被任何其他指向.

您没有显示函数的代码,因此可能存在静态变量.限制是保证这些静态变量不对参数进行别名.

您的示例中可能未显示全局变量.限制是对这些全局变量不对参数进行别名的保证.

实际上,你是对的:有人可能会因为限制而变得有点疯狂.但限制也并不意味着"这一参数和参数".它的意思是"这个指针和任何其他指针".