restrict

Section spécifique à Microsoft

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

Syntaxe

__declspec(restrict)pointer_return_type function() ;

Notes

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

Le compilateur n’case activée pas que le pointeur retourné n’est pas réellement alias. Il incombe au développeur de s’assurer que le programme n’a pas d’alias de pointeur marqué avec la restriction __declspec modificateur.

Pour obtenir une sémantique similaire sur 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 la restrict mot clé qui fait partie de L’AMP C++, consultez restreindre (C++AMP) .

Exemple

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

Lorsqu’elle __declspec(restrict) est appliquée à une fonction qui retourne un pointeur, cela indique au compilateur que la mémoire pointée par la valeur de retour n’est pas aliasée. Dans cet exemple, les pointeurs mempool et memptr sont globaux, de sorte que le compilateur ne peut pas être sûr que la mémoire à laquelle ils font référence n’est pas 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, de sorte que __decslpec(restreindre) est 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 l’utilisation __declspec(restrict) pour indiquer qu’elles retournent toujours la mémoire qui ne peut pas être 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)