关于仅由restrict指针参数声明推断无别名规则的技术疑问
关于C语言
restrict关键字的规范疑问 【示例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的意图。
第13、14、15条款的示例5、6、7进一步加深了此困惑。若将第8条款文本修改为"……若某对象被修改且被访问……"及调整后续示例可解决困惑,但这似乎会改变原有语义。
内容的提问来源于stack exchange,提问作者nknight
相关产品推荐
相关产品推荐

