restrict
Microsoft-spezifisch
Wenn sie auf eine Funktionsdeklaration oder -definition angewendet wird, die einen Zeigertyp zurückgibt, teilt dem Compiler mit, restrict
dass die Funktion ein Objekt zurückgibt, das nicht aliasiert ist, d. h. auf andere Zeiger verwiesen wird. Dadurch kann der Compiler zusätzliche Optimierungen durchführen.
Syntax
__declspec(restrict)
pointer_return_type Funktion();
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 überprüft nicht, ob der zurückgegebene Zeiger tatsächlich aliast ist. Es liegt in der Verantwortung des Entwicklers, sicherzustellen, dass das Programm keinen Alias für einen Zeiger hat, der mit dem Einschränkungs-__declspec Modifizierer gekennzeichnet ist.
Ä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 zu den Schlüsselwort (keyword), die Teil von C++ AMP sind, finden Sie unter Restrict (C++ AMP).For information about the restrict
Schlüsselwort (keyword) that is part of C++ AMP, see restrict (C++ AMP).
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 malloc
wie die Verwendung verwenden __declspec(restrict)
, 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
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