restrict
Microsoft-spezifisch
Wenn sie auf eine Funktionsdeklaration oder Definition angewendet wird, die einen Zeigertyp zurückgibt, restrict
teilt der Compiler mit, dass die Funktion ein Objekt zurückgibt, das nicht alias ist, das von anderen Zeigern verwiesen wird. Dadurch kann der Compiler zusätzliche Optimierungen ausführen.
Syntax
__declspec(restrict)
pointer_return_typefunction();
Hinweise
Der Compiler verteilt __declspec(restrict)
. Die CRT-Funktion malloc
weist beispielsweise eine __declspec(restrict)
Dekoration auf, und daher wird davon ausgegangen, dass Zeiger auf Speicherspeicherorte initialisiert werden, indem malloc
sie auch nicht von zuvor vorhandenen Zeigern aliast werden.
Der Compiler überprüft nicht, dass der zurückgegebene Zeiger nicht tatsächlich aliast ist. Es ist die Verantwortung des Entwicklers, sicherzustellen, dass das Programm keinen Zeiger aliast, der mit dem Einschränkungs-__declspec Modifier 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 zum restrict
Schlüsselwort, das Teil C++ AMP ist, finden Sie unter "einschränken" (C++ AMP).
Beispiel
Im folgenden Beispiel wird die Verwendung von __declspec(restrict)
.
Wenn __declspec(restrict)
auf eine Funktion angewendet wird, die einen Zeiger zurückgibt, wird der Compiler informiert, dass der Speicher, auf den der Rückgabewert verweist, nicht aliast 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 aliast ist. Sie werden jedoch innerhalb ma
und dessen Aufrufer init
auf eine Weise verwendet, die Speicher zurückgibt, auf die nicht andernfalls vom Programm verwiesen wird, daher wird __decslpec(restrict) verwendet, um dem Optimierungsgeber zu helfen. Dies ähnelt der Art, wie die CRT-Kopfzeilen malloc
__declspec(restrict)
Funktionen wie z. B. mithilfe von Verwendung, um anzugeben, dass sie immer Speicher zurückgeben, die nicht von vorhandenen Zeigern aliast werden können.
// 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