noalias

Específico de Microsoft

noaliassignifica que una llamada de función no modifica ni hace referencia al noalias estado global visible y solo modifica la memoria a la que apuntan directamente los parámetros de puntero (direccionamientos indirectos de primer nivel).

Si una función se anota como , el optimizador puede suponer que solo se hace referencia o se modifican dentro de la función los propios parámetros y solo los direccionamientos indirectos de primer nivel de los parámetros de noalias puntero.

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

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

Ejemplo

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

Cuando se anota la función que tiene acceso a la memoria , indica al compilador que esta función no modifica el estado global excepto a través de los punteros de su lista multiply__declspec(noalias) 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);
}

Vea también

__declspec
Palabras clave
__declspec(restrict)