Share via


restrict

Sezione specifica Microsoft

Se applicato a una dichiarazione o a una definizione di funzione che restituisce un tipo di puntatore, restrict indica al compilatore che la funzione restituisce un oggetto non con alias, ovvero a cui fa riferimento qualsiasi altro puntatore. In questo modo il compilatore può eseguire ottimizzazioni aggiuntive.

Sintassi

__declspec(restrict)pointer_return_type funzione();

Osservazioni:

Il compilatore propaga __declspec(restrict). Ad esempio, la funzione CRT malloc ha una __declspec(restrict) decorazione e pertanto il compilatore presuppone che anche i puntatori inizializzati in posizioni di memoria da malloc non siano aliasati dai puntatori esistenti in precedenza.

Il compilatore non verifica che il puntatore restituito non sia effettivamente aliasato. È responsabilità dello sviluppatore assicurarsi che il programma non alias un puntatore contrassegnato con il modificatore limita __declspec .

Per una semantica simile sulle variabili, vedere __restrict.

Per un'altra annotazione applicabile all'aliasing all'interno di una funzione, vedere __declspec(noalias).

Per informazioni sulla restrict parola chiave che fa parte di C++ AMP, vedere Restrict (C++ AMP).

Esempio

Nell'esempio seguente viene illustrato l'uso di __declspec(restrict).

Quando __declspec(restrict) viene applicato a una funzione che restituisce un puntatore, indica al compilatore che la memoria a cui punta il valore restituito non è aliasato. In questo esempio, i puntatori mempool e memptr sono globali, quindi il compilatore non può essere sicuro che la memoria a cui fanno riferimento non sia aliasata. Tuttavia, vengono usati all'interno ma del chiamante e nel suo chiamante init in modo che restituisca memoria non diversamente a cui fa riferimento il programma, quindi __decslpec(restrict) viene usato per aiutare l'ottimizzatore. Questo è simile al modo in cui le intestazioni CRT decorano le funzioni di allocazione, ad malloc esempio usando __declspec(restrict) per indicare che restituiscono sempre memoria che non possono essere aliasate da puntatori esistenti.

// 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);
}

Fine sezione specifica Microsoft

Vedi anche

Parole chiave
__declspec
__declspec(noalias)