restrict
Seção específica da Microsoft
Quando aplicado a uma declaração ou a uma definição de função que retorna um tipo de ponteiro, restrict
diz ao compilador que a função retorna um objeto sem alias, ou seja, referenciado por quaisquer outros ponteiros. Isso permite que o compilador execute otimizações adicionais.
Sintaxe
__declspec(restrict)
pointer_return_type function();
Comentários
O compilador propaga __declspec(restrict)
. Por exemplo, a função CRT malloc
tem uma decoração __declspec(restrict)
e, portanto, o compilador pressupõe que os ponteiros inicializados para locais de memória por malloc
também não tem alias por ponteiros existentes anteriormente.
O compilador não verifica se o ponteiro retornado realmente não possui alias. É responsabilidade do desenvolvedor assegurar que o programa não coloque alias em um ponteiro com o modificador restrict __declspec.
Para a semântica semelhante em variáveis, confira __restrict.
Para outra anotação que se aplica ao alias dentro de uma função, confira __declspec(noalias).
Para obter informações sobre a palavra-chave restrict
que é parte do C++ AMP, confira restrict (C++ AMP).
Exemplo
O exemplo a seguir demonstra o uso de __declspec(restrict)
.
Quando __declspec(restrict)
é aplicado a uma função que retorna um ponteiro, isso informa ao compilador que a memória apontada pelo valor retornado não tem alias. Neste exemplo, os ponteiros mempool
e memptr
são globais, portanto, o compilador não pode ter certeza de que a memória à qual se referem não está com alias. No entanto, eles são usados dentro ma
e seu chamador init
de maneira que retorna memória que não é referenciada de outra forma pelo programa, portanto __decslpec(restrict) é usado para ajudar o otimizador. Isso é semelhante a como os cabeçalhos CRT decoram funções de alocação, como malloc
usando __declspec(restrict)
para indicar que eles sempre retornam memória que não pode ser alias por ponteiros existentes.
// 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);
}
Fim da seção específica da Microsoft