noalias
Microsoft-spezifisch
noalias
bedeutet, 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 noalias
Anmerkungen 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
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für