ograniczenie

Specyficzne dla firmy Microsoft

W przypadku zastosowania do deklaracji funkcji lub definicji zwracającej typ restrict wskaźnika informuje kompilator, że funkcja zwraca obiekt, który nie jest aliasowany, czyli przywoływane przez inne wskaźniki. Dzięki temu kompilator może wykonywać dodatkowe optymalizacje.

Składnia

__declspec(restrict)pointer_return_type function();

Uwagi

Kompilator propaguje __declspec(restrict)element . Na przykład funkcja CRT malloc ma dekorację __declspec(restrict) , a zatem kompilator zakłada, że wskaźniki inicjowane do lokalizacji malloc pamięci nie są również aliasowane przez wcześniej istniejące wskaźniki.

Kompilator nie sprawdza, czy zwrócony wskaźnik nie jest w rzeczywistości aliasowany. Obowiązkiem dewelopera jest upewnienie się, że program nie aliasuje wskaźnika oznaczonego za pomocą modyfikatora ograniczeń __declspec .

Aby uzyskać informacje o podobnych semantyce zmiennych, zobacz __restrict.

Aby uzyskać inną adnotację, która ma zastosowanie do aliasów w funkcji, zobacz __declspec(noalias).

Aby uzyskać informacje o słowie restrict kluczowym, które jest częścią języka C++ AMP, zobacz ograniczanie (C++ AMP).

Przykład

W poniższym przykładzie pokazano użycie metody __declspec(restrict).

Gdy __declspec(restrict) jest stosowany do funkcji zwracającej wskaźnik, informuje kompilator, że pamięć wskazywana przez wartość zwracaną nie jest aliasem. W tym przykładzie wskaźniki mempool i memptr są globalne, więc kompilator nie może mieć pewności, że pamięć, do której się odwołuje, nie jest aliasem. Są one jednak używane w obiekcie ma i jego obiekt wywołujący init w sposób, który zwraca pamięć, która nie jest w inny sposób odwoływali się do programu, więc __decslpec(ogranicz) jest używana do pomocy optymalizatorowi. Jest to podobne do sposobu, w jaki nagłówki CRT dekorują funkcje alokacji, takie jak malloc za pomocą polecenia __declspec(restrict) , aby wskazać, że zawsze zwracają pamięć, której nie można aliasować przez istniejące wskaźniki.

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

END Microsoft Specific

Zobacz też

Słowa kluczowe
__declspec
__declspec (noalias)