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

Siehe auch

Schlüsselwörter
__declspec
__declspec(noalias)