C语言规范(n3096,6.7.3.1/8)给出了以下示例
示例2以下示例中的函数参数声明
void f(int n, int * restrict p, int * restrict q) { while (n-- > 0) *p++ = *q++; }
断言,在函数的每次执行过程中,如果通过指针之一访问对象, 参数,则它也不能通过其他访问.翻译器可以使这种无锯齿 仅基于参数声明进行推理,而不分析函数体.
翻译器如何仅根据参数声明来推断这一点呢?
例如,请允许我修改此示例,保留参数声明,如下所示.
int sum;
void f(int n, int * restrict p, int * restrict q)
{
while (n-- > 0)
sum += *p++ + *q++;
}
我认为现在允许通过p
和q
访问同一个对象,因为这个对象不再被修改.(事实上,这似乎是条例草案第10条下一个例子3的要点.).
例5、例6和例7(第13、14、15条)加深了我的困惑.解决我困惑的一种方法是修改第8条中的案文,
"...如果对象被modified and访问..."
以及在随后的实施例中的类似变化.但对我来说,这似乎改变了语义.