const限定指针的限制是多余的?

vic*_*ncb 17 c

如果我们将f和g定义为:

void f(const int *restrict a, const int *restrict b, int *c){ ... }
void g(const int *         a, const int *         b, int *c){ ... }
Run Code Online (Sandbox Code Playgroud)
  1. 假设f和g具有相同的主体,从调用者的角度来看它们是否相同?
  2. 在被调用者中,我们可以对参数做出相同的假设吗?
  3. 编译器有相同的优化机会吗?

如果restrict多余,我希望所有三个答案都是肯定的.
否则,为什么不呢?

不要考虑糟糕的编程习惯,比如抛弃const限定符.

M.M*_*M.M 4

对于本例:

void f(const int *restrict a, const int *restrict b, int *c)
Run Code Online (Sandbox Code Playgroud)

restrict并不多余。这意味着编译器可以假设这一点a并且c不使用别名。例如,如果函数体是:

int d = *a;
*c = 5;
d = *a;
Run Code Online (Sandbox Code Playgroud)

那么编译器可以删除第三行。


C11 6.7.3/7 涵盖了这一点:

这种关联(在下面的 6.7.3.1 中定义)要求对该对象的所有访问都直接或间接地使用该特定指针的值。

也就是说,如果通过 访问某个对象a,则不允许通过b或访问该对象c

正式定义可见C11 6.7.3.1/4(restrict的正式定义):

如果L用于访问它所指定的对象X的值,并且X也被修改(以任何方式),则以下要求适用:T不应是 const 限定的

这里T是 指向的声明类型,a即 ,const intL*aX 是 和指向的int任何类型。ac