restrict
Specifické pro Microsoft
Při použití na deklaraci funkce nebo definici, která vrací typ ukazatele, informuje kompilátor, restrict
že funkce vrátí objekt, který není aliasovaný, tj. odkazovanými jinými ukazateli. Kompilátor tak může provádět další optimalizace.
Syntaxe
__declspec(restrict)
pointer_return_typefunction();
Poznámky
Kompilátor se šíří __declspec(restrict)
. Funkce CRT malloc
__declspec(restrict)
má například dekoraci, a proto kompilátor předpokládá, že ukazatele inicializované na umístění malloc
paměti také nejsou aliasovány dříve existujícími ukazateli.
Kompilátor nekontroluje, že vrácený ukazatel není ve skutečnosti aliasován. Je zodpovědností vývojáře, aby program neposílil ukazatel označený modifikátorem omezení __declspec .
Podobné sémantiky u proměnných najdete v tématu __restrict.
Další poznámku, která se vztahuje na aliasy v rámci funkce, najdete v tématu __declspec(noalias).a0>
Informace o klíčovém slově restrict
, které je součástí C++ AMP, naleznete v tématu omezení (C++ AMP).
Příklad
Následující ukázka ukazuje použití __declspec(restrict)
.
Při __declspec(restrict)
použití funkce, která vrací ukazatel, to kompilátoru říká, že paměť odkazovaná návratovou hodnotou není aliasována. V tomto příkladu jsou ukazatele mempool
a memptr
globální, takže kompilátor si nemůže být jistý, že paměť, na kterou odkazují, není aliasována. Používají se však v rámci ma
volajícího a jeho volajícím init
způsobem, který vrací paměť, na kterou program jinak neodkazuje, takže __decslpec(omezení) slouží k usnadnění optimalizátoru. To se podobá tomu, jak hlavičky CRT ozdobují funkce přidělování, jako malloc
je použití __declspec(restrict)
, aby vždy vracely paměť, která nemůže být aliasována existujícími ukazateli.
// 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
Viz také
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro