Freigeben über


restrict

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 mallocmit 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

Weitere Informationen

Schlüsselwörter
__declspec
__declspec(noalias)