noalias

Spécifique à Microsoft

noalias signifie qu’un appel de fonction ne modifie pas ou ne référence pas l’état global visible et modifie uniquement la mémoire pointée directement par les paramètres de pointeur (indirections de premier niveau).

Si une fonction est annotée en tant que noalias, l’optimiseur peut supposer que seuls les paramètres eux-mêmes, et uniquement les indirections de premier niveau des paramètres de pointeur, sont référencés ou modifiés à l’intérieur de la fonction.

L’annotation noalias s’applique uniquement dans le corps de la fonction annotée. Le marquage d’une fonction comme __declspec(noalias) n’affecte pas l’alias des pointeurs retournés par la fonction.

Pour obtenir une autre annotation qui peut avoir un impact sur l’alias, consultez __declspec(restrict).

Exemple

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

Lorsque la fonction multiply qui accède à la mémoire est annotée __declspec(noalias), elle indique au compilateur que cette fonction ne modifie pas l’état global, sauf par le biais des pointeurs de sa liste de paramètres.

// declspec_noalias.c
#include <stdio.h>
#include <stdlib.h>

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

float * mempool, * memptr;

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

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.1/k++;
    return a;
}

__declspec(noalias) 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);
}

Voir aussi

__declspec
Mots clés
__declspec(restrict)