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,并funcB用restrict?
funcA只需要1个参数.它怎么能和其他地址一样?
funcB采用不同类型的参数.如果它们是相同的地址,那么这不会破坏严格的别名规则吗?
该restrict关键字是意向声明,为改进优化.这意味着给定指针指向的对象在(在这种情况下)函数参数的生命周期中不会被任何其他指向.
您没有显示函数的代码,因此可能存在静态变量.限制是保证这些静态变量不对参数进行别名.
您的示例中可能未显示全局变量.限制是对这些全局变量不对参数进行别名的保证.
实际上,你是对的:有人可能会因为限制而变得有点疯狂.但限制也并不意味着"这一参数和参数".它的意思是"这个指针和任何其他指针".