Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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);
}