在C中使用strict关键字的规则?
我试图了解何时以及何时不使用 restrictC中关键字,以及在什么情况下它提供了明显的好处。 阅读了“ Demystifying The Restrict Keyword ”(提供了一些使用经验的规则)后,我得到的印象是,当函数传递指针时,它必须考虑所指向的数据可能重叠的可能性(别名)并将任何其他参数传递到函数中。给定一个功能: foo(int *a, int *b, int *c, int n) { for (int i = 0; i<n; ++i) { b[i] = b[i] + c[i]; a[i] = a[i] + b[i] * c[i]; } } 编译器必须c在第二个表达式中重新加载,因为也许b并c指向同一位置。由于相同的原因,它还必须等待b存储后才能加载a。然后,它必须等待a存储和必须重新加载b,并c在下一循环的开始。如果您像这样调用函数: int a[N]; foo(a, a, a, N); 然后您会看到编译器为什么必须这样做。restrict有效使用会告诉编译器您永远都不会这样做,因此它可以删除存储的冗余负载c和a之前的负载b。 在另一篇SO文章中,Nils Pipenbrinck提供了此方案的一个有效示例,展示了性能优势。 到目前为止,我已经收集到,使用它是一个好主意 …