noalias

Específico de Microsoft

noalias significa que una llamada de función no modifica el estado global visible ni hace referencia a él y solo modifica la memoria designada directamente por los parámetros de puntero (direccionamientos indirectos de primer nivel).

Si una función está anotada como noalias, el optimizador puede suponer que, solo los parámetros en sí mismos, dentro de la función y solo los direccionamientos indirectos de primer nivel de los parámetros del puntero se modifican o se hace referencia a ellos.

La anotación noalias solo se aplica dentro del cuerpo de la función anotada. Marcar una función como __declspec(noalias) no afecta al alias de punteros devueltos por la función.

Para obtener otra anotación que pueda afectar al alias, consulte __declspec(restrict).

Ejemplo

En el ejemplo siguiente se muestra el uso de __declspec(noalias).

Cuando la función multiply que accede a la memoria con está anotada como __declspec(noalias), se le indica al compilador que esta función no modifica el estado global excepto a través de los punteros en su lista de parámetros.

// 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);
}

Consulte también

__declspec
Palabras clave
__declspec(restrict)