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
Wenn Angewendet auf eine Funktionsdeklaration oder eine Definition, die einen Zeigertyp zurückgibt, teilt restrict
dem Compiler mit, dass die Funktion ein Objekt zurückgibt, das keinen Alias mit anderen Zeigern besitzt, d.h. nicht von anderen Zeigern referenziert wird. Dadurch kann der Compiler zusätzliche Optimierungen durchführen.
Syntax
__declspec(restrict)
pointer_return_type function();
Hinweise
Der Compiler verteilt __declspec(restrict)
. Beispielsweise verfügt die CRT-Funktion malloc
über eine __declspec(restrict)
Dekoration, daher geht der Compiler davon aus, dass Zeiger, die auf Speicherspeicherorte malloc
initialisiert wurden, auch nicht von zuvor vorhandenen Zeigern aliasiert werden.
Der Compiler prüft nicht, ob der zurückgegebene Zeiger tatsächlich nicht mit einem Alias versehen ist. Es liegt in der Verantwortung des Entwicklers, sicherzustellen, dass das Programm einem Zeiger, der mit dem restrict __declspec-Modifizierer markiert ist, keinen Alias zuweist.
Eine ähnliche Semantik für Variablen finden Sie unter __restrict.
Eine weitere Anmerkung, die für Aliasing innerhalb einer Funktion gilt, finden Sie unter __declspec(noalias).
Informationen zum restrict
-Schlüsselwort, das Bestandteil von C++ AMP ist, finden Sie unter (C++ AMP) einschränken.
Beispiel
Das folgende Beispiel veranschaulicht die Verwendung von __declspec(restrict)
.
Wenn __declspec(restrict)
auf eine Funktion angewendet wird, die einen Zeiger zurückgibt, teilt dies dem Compiler mit, dass der Speicher, auf den der Rückgabewert verweist, nicht aliasiert ist. In diesem Beispiel sind die Zeiger mempool
und memptr
global, sodass der Compiler nicht sicher sein kann, dass der Speicher, auf den sie verweisen, nicht aliasiert ist. Sie werden jedoch innerhalb ma
und des Aufrufers init
auf eine Weise verwendet, die Arbeitsspeicher zurückgibt, der sonst nicht vom Programm referenziert wird, sodass __decslpec(restrict) verwendet wird, um dem Optimierer zu helfen. Dies ähnelt der Art, wie die CRT-Header Zuweisungsfunktionen wie malloc
mit der Verwendung von __declspec(restrict)
verwenden, um anzugeben, dass sie immer Arbeitsspeicher zurückgeben, der nicht von vorhandenen Zeigern aliasiert werden kann.
// declspec_restrict.c
// Compile with: cl /W4 declspec_restrict.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.1f/k++;
return a;
}
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);
}
Ende Microsoft-spezifisch