数组参数可以互相别名,编译器必须仔细考虑这种可能性。因此,例如:GodBolt
int foo(int a[10], int b[10]) {
a[0] += b[0];
return a[0] + b[0];
}
int bar(int *a, int *b) {
a[0] += b[0];
return a[0] + b[0];
}
int baz(int * __restrict a, int * __restrict b) {
a[0] += b[0];
return a[0] + b[0];
}
foo()
的编译代码必须与bar()
相同,而不是与baz()
相同。
我想在我的函数中使用数组参数 - 甚至可能是多维数组(不是指针数组;您用一对方括号声明并衰减为指向第一个元素的简单单级指针的类型)。我还希望编译器假设没有别名,即我想将我的数组参数标记为
restrict
'ed。
如何用 C 语言做到这一点?如果我不能——那是为什么?
您可以将限定符放在参数的最左边的数组声明中(即转换为指针的部分):
int foo(int a[restrict 10], int b[restrict 10]) {
a[0] += b[0];
return a[0] + b[0];
}