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ż
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla