Dela via


noalias

Microsoft-specifika

noalias innebär att ett funktionsanrop inte ändrar eller refererar till synligt globalt tillstånd och endast ändrar det minne som pekar direkt med pekarparametrar (indirekta värden på första nivån).

Om en funktion kommenteras som noaliaskan optimeraren anta att endast själva parametrarna, och endast indirekta på första nivån av pekarparametrar, refereras eller ändras i funktionen.

Anteckningen noalias gäller endast i brödtexten i den kommenterade funktionen. Att markera en funktion som påverkar inte aliaseringen av pekare som __declspec(noalias) returneras av funktionen.

En annan anteckning som kan påverka alias finns i __declspec(restrict).

Exempel

Följande exempel visar användningen av __declspec(noalias).

När funktionen multiply som kommer åt minnet kommenteras __declspec(noalias)meddelar den kompilatorn att den här funktionen inte ändrar det globala tillståndet förutom genom pekarna i parameterlistan.

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

Se även

__declspec
nyckelord
__declspec(restrict)