noalias

Microsoft-spezifisch

noaliasbedeutet, dass ein Funktionsaufruf den sichtbaren globalen Zustand nicht ändert oder referenziert und nur den Speicher ändert, auf den direkt durch Zeigerparameter (Dereferenzierungen der ersten Ebene) verwiesen wird.

Wenn eine Funktion mit noaliasAnmerkungen versehen ist, kann der Optimierer davon ausgehen, dass nur die Parameter selbst und nur dereferenzierte Dereferenzierungen von Zeigerparametern innerhalb der Funktion referenziert oder geändert werden.

Die noalias Anmerkung gilt nur im Textkörper der kommentierten Funktion. Das Markieren einer Funktion als __declspec(noalias) wirkt sich nicht auf die Aliasierung von Zeigern aus, die von der Funktion zurückgegeben werden.

Eine weitere Anmerkung, die sich auf aliasing auswirken kann, finden Sie unter __declspec(restrict).

Beispiel

Das folgende Beispiel veranschaulicht die Verwendung von __declspec(noalias).

Wenn die Funktion multiply , die auf den Arbeitsspeicher zugreift, kommentiert __declspec(noalias)wird, teilt sie dem Compiler mit, dass diese Funktion den globalen Zustand nicht ändert, außer über die Zeiger in der Parameterliste.

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

Siehe auch

__declspec
Schlüsselwörter
__declspec(restrict)