restrict
我理解类似的有用性
void foo(size_t n, double * restrict a, double * restrict b)
然而,查看 的手册页printf
,我们发现:
int fprintf(FILE *restrict stream,
const char *restrict format, ...);
两个指针都标记为restrict
ed,但是它们指向不同的类型,因此根据我的理解,它们无论如何都不能是别名(除非FILE
是 typedef for char
),因此restrict
不提供任何更多信息。
我是否正确,或者手册页显示了有效的用法?
你不正确。
首先,指针值可以转换为不同的指针类型,因此不能仅根据类型假设非别名,至少在函数调用接口处不能。原则上,该函数可以将 转换
FILE *
为 achar *
并使用结果来访问所指向的任何数据。这甚至不需要违反严格的别名规则,但根据细节,它可能会违反restrict
资格。但是这个领域中一个更合理的问题是,如果
FILE
是结构类型(通常是),并且调用此函数的第二个参数指向所指向结构的成员FILE
。对该成员的修改可能会违反restrict
资格。此外,您忽略了
fprintf()
需要任意数量的附加参数并且它原则上可以访问外部对象。所施加的非别名要求与- 限定的指restrict
针对无关restrict
。它们是关于restrict
相对于任何其他修改对象的方法的单独限定指针。最后,即使我们可以以某种方式从函数签名中得出结论(与实际情况相反),不可能存在相关的别名,这也不会使使用
restrict
无效。这只是多余的。