The*_*Fox 6 c pointers restrict-qualifier
大多数限制的定义都说它是程序员对编译器的承诺,在指针的生命周期中,指针是访问对象的唯一方式.这允许编译器优化输出,因为它知道它只能被一个指针访问,因此只能由它来改变.如果我理解正确通常意味着程序不必重新加载指针指向的值.
如果这是正确的,那么当restrict关键字应该可用时应该有一些例外,即使它违背了应该如何使用它的意图.
我想到的一件事是指针指向的数据在指针的生命周期内从未实际发生过变化.在这种情况下,即使指针指向同一位置也不需要重新加载数据,因为它们在指针的生命周期中不会改变.例如:
int max(int *restrict a, int *restrict b) {
return((*a > *b) ? *a : *b);
}
int main(void) {
int num = 3;
int max = max(&num, &num);
}
Run Code Online (Sandbox Code Playgroud)
这是对限制的有效使用,即使它与它应该如何使用相反吗?使用这样的restrict关键字会导致未定义的行为吗?
正如埃里克在一条现已消失的评论中所说,其中的关键词是:C99 draft standard 6.7.3.1 Formal definition of restrict
`If\xe2\x80\xa6 X is also modified\xe2\x80\xa6`\nRun Code Online (Sandbox Code Playgroud)\n\n此解释得到以下示例的支持6.7.3.1/10:
void h(int n, int * restrict p, int * restrict q, int * restrict r)\n{\n int i;\n for (i = 0; i < n; i++)\n p[i] = q[i] + r[i];\n}\nRun Code Online (Sandbox Code Playgroud)\n\n以及代码示例的以下注释:
\n\n\n\n\n说明如何通过两个受限指针为未修改的对象添加别名。特别是,如果 a 和 b 是不相交的数组,则 h(100, a, b, b) 形式的调用具有定义的行为,因为数组 b 不会在函数 h 内修改。
\n
因此,您的具体示例似乎是defined behavior因为您没有修改aor b。