noalias

Específicos de Microsoft

noalias significa que una llamada de función no modifica ni hace referencia al estado global visible y no modifica solo memoria designada en directly por los parámetros de puntero (direccionamientos indirectos de primer nivel).

Si una función está marcado como noalias, el optimizador puede suponer que, además de los parámetros propios, sólo direccionamientos indirectos de primer nivel de los parámetros del puntero se hace referencia o se modifican dentro de la función.El estado global visible es el conjunto de todos los datos que no está definido o hace referencia fuera del ámbito de la compilación, y no toman su dirección.El ámbito de la compilación es todos los archivos de código fuente (compilaciones de/LTCG (Generación de código en tiempo de enlace) ) o un único archivo de código fuente (/LTCG no compilado).

Ejemplo

El ejemplo siguiente se muestra con __declspec(restrict) y __declspec(noalias).Normalmente, la memoria devuelta de malloc es restrict y noalias porque los encabezados de CRT se decoran correctamente.

Sin embargo, en este ejemplo, punteros mempool y memptrson globales para que el compilador no tiene ninguna garantía que la memoria no está sujeto a alias.Mediante las funciones que devuelven punteros con __declspec(restrict) indican el compilador a que la memoria indicada por el valor devuelto no es con alias.

Mediante la función en el ejemplo que la memoria de accesos con __declspec(noalias) indica al compilador que esta función no interfiera con 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;

__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.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

Referencia

__declspec

Palabras clave de C++