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

Schlüsselwörter
__declspec
__declspec(noalias)