Partager via


restrict

Section spécifique à Microsoft

Lorsqu’il est appliqué à une déclaration ou une définition de fonction qui retourne un type pointeur, restrict indique au compilateur que la fonction retourne un objet qui n’est pas un alias qui est référencé par tout autre pointeur. Cela permet au compilateur d’effectuer des optimisations supplémentaires.

Syntaxe

__declspec(restrict) pointer_return_type function();

Notes

Le compilateur propage __declspec(restrict). Par exemple, la fonction malloc CRT a une décoration __declspec(restrict) et, par conséquent, le compilateur suppose que les pointeurs initialisés vers des emplacements de mémoire par malloc ne sont pas également des alias par des pointeurs existants.

Le compilateur ne vérifie pas que le pointeur retourné n’est pas réellement un alias. Il incombe au développeur de s’assurer que le programme n’attribue pas d’alias à un pointeur marqué avec le modificateur restrict __declspec.

Pour des sémantiques semblables concernant les variables, consultez __restrict.

Pour obtenir une autre annotation qui s’applique à l’alias dans une fonction, consultez __declspec(noalias).

Pour plus d’informations sur le mot clé restrict qui fait partie de C++ AMP, consultez restrict (C++ AMP).

Exemple

L’exemple suivant illustre l’utilisation de __declspec(restrict).

Lorsque __declspec(restrict) s’applique à une fonction qui retourne un pointeur, cela indique au compilateur que la mémoire vers laquelle pointe la valeur de retour n’a pas d’alias. Dans cet exemple, les pointeurs mempool et memptr sont globaux. Le compilateur ne peut ainsi pas être sûr que la mémoire à laquelle ils font référence n’est pas un alias. Toutefois, ils sont utilisés dans ma et son appelant init d’une manière qui retourne la mémoire qui n’est pas référencée par le programme. __decslpec(restrict) est ainsi utilisé pour aider l’optimiseur. Cela est similaire à la façon dont les en-têtes CRT décorent les fonctions d’allocation telles que malloc par l’utilisation __declspec(restrict) pour indiquer qu’elles retournent toujours la mémoire qui ne peut pas être un alias par des pointeurs existants.

// declspec_restrict.c
// Compile with: cl /W4 declspec_restrict.c
#include <stdio.h>
#include <stdlib.h>

#define M 800
#define N 600
#define P 700

float * mempool, * memptr;

__declspec(restrict) float * ma(int size)
{
    float * retval;
    retval = memptr;
    memptr += size;
    return retval;
}

__declspec(restrict) float * init(int m, int n)
{
    float * a;
    int i, j;
    int k=1;

    a = ma(m * n);
    if (!a) exit(1);
    for (i=0; i<m; i++)
        for (j=0; j<n; j++)
            a[i*n+j] = 0.1f/k++;
    return a;
}

void multiply(float * a, float * b, float * c)
{
    int i, j, k;

    for (j=0; j<P; j++)
        for (i=0; i<M; i++)
            for (k=0; k<N; k++)
                c[i * P + j] =
                          a[i * N + k] *
                          b[k * P + j];
}

int main()
{
    float * a, * b, * c;

    mempool = (float *) malloc(sizeof(float) * (M*N + N*P + M*P));

    if (!mempool)
    {
        puts("ERROR: Malloc returned null");
        exit(1);
    }

    memptr = mempool;
    a = init(M, N);
    b = init(N, P);
    c = init(M, P);

    multiply(a, b, c);
}

FIN de la section spécifique à Microsoft

Voir aussi

Mots clés
__declspec
__declspec(noalias)