Motivação
Parâmetros de array podem ser alias uns dos outros, e o compilador deve cuidadosamente permitir essa possibilidade. Assim, por exemplo: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];
}
o código compilado para foo()
deve ser como o de bar()
, não como o de baz()
.
Pergunta
Quero usar parâmetros de array para minha função - possivelmente até arrays multidimensionais (não arrays-de-ponteiros; o tipo que você declara com um par de colchetes e decai para ponteiros simples de um nível para o primeiro elemento). E também quero que o compilador assuma que não há aliasing, ou seja, quero marcar meus parâmetros de array como restrict
'ed.
Como posso fazer isso em C? E se não posso, por que?
Você pode colocar qualificadores na declaração de array mais à esquerda de um parâmetro (ou seja, a parte que é convertida em um ponteiro):