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é ``