Pointeurs « restrict »
Le C permet de qualifier un pointeur comme étant non-aliasé, c’est à dire comme étant l’unique pointeur référencant l’objet en question.
Voici un code illustrant une optimisation permise par restrict
void square(int * num, int * num2, int * val) {
*num += *val;
*num2 += *val;
}
Ici le compilateur ne peut pas savoir si val
et num
ont
la même valeur, c’est à dire pointent à la même adresse,
et par précaution génère le code assembleur suivant :
square:
mov eax, DWORD PTR [rdx]
add DWORD PTR [rdi], eax
mov eax, DWORD PTR [rdx]
add DWORD PTR [rsi], eax
ret
Il est possible que l’addition sur num
ait modifiée la valeur
pointée par val
et il doit la recharger.
En ajoutant le qualificateur restrict
à num
, le compilateur
sait qu’aucun autre pointeur ne pointe à l’adresse utilisée
par num
.
void square(int * restrict num, int * num2, int * val) {
*num += *val;
*num2 += *val;
}
Le code assembleur généré est le suivant :
square:
mov eax, DWORD PTR [rdx]
add DWORD PTR [rdi], eax
add DWORD PTR [rsi], eax
ret
De même
int square(int * restrict a, int * b) {
*a = 1;
*b = 2;
return *a;
}
Ici, le compilateur peut placer directement 1 dans eax
:
mov eax 1
plutôt que devoir chercher la valeur dans la pile
mov eax, DWORD PTR [rdi]
.
Le pointeur restrict est absent C++
En C++ le qualificateur restrict
n’existe pas : déclarer
un pointeur restrict
sur un objet entrerait en conflit
avec le pointeur implicite this
au sein de cet objet.
Il n’est pas prévu qu’en C++2X celui-ci soit ajouté au C++.
Le compilateur IBM AIX le supporte avec l’extension de compilateur et le mot clé ``