如果我们将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)
如果restrict
多余,我希望所有三个答案都是肯定的.
否则,为什么不呢?
不要考虑糟糕的编程习惯,比如抛弃const
限定符.
对于本例:
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 int
L是,*a
X 是 和所指向的int
任何类型。a
c