restrict
Específicos de Microsoft
Cuando se aplica a una declaración de función o a una definición que devuelve un tipo de puntero, restrict
indica al compilador que la función devuelve un objeto que no tiene alias, es decir, que no hace referencia a él ningún otro puntero. Esto permite al compilador realizar optimizaciones adicionales.
Sintaxis
__declspec(restrict)
pointer_return_typefunction();
Comentarios
El compilador propaga __declspec(restrict)
. Por ejemplo, la función malloc
de CRT tiene una decoración __declspec(restrict)
y, por lo tanto, el compilador supone que los punteros que malloc
inicializa en ubicaciones de memoria tampoco tienen alias de punteros existentes anteriormente.
El compilador no comprueba que el puntero devuelto realmente no tenga alias. Es responsabilidad del programador garantizar que el programa no use un alias de un puntero marcado con el modificador restrict __declspec.
Para conocer la semántica similar en las variables, consulte __restrict.
Para obtener otra anotación que se aplica al alias dentro de una función, consulte __declspec(noalias).
Para obtener información sobre la palabra clave restrict
que forma parte de C++ AMP, consulte restrict (C++ AMP).
Ejemplo
En el ejemplo siguiente se muestra el uso de __declspec(restrict)
.
Cuando __declspec(restrict)
se aplica a una función que devuelve un puntero, esto indica al compilador que la memoria a la que apunta el valor devuelto no tiene alias. En este ejemplo, los punteros mempool
y memptr
son globales, por lo que el compilador no puede estar seguro de que la memoria a la que hacen referencia no tiene alias. Aun así, se usan en ma
y su llamador init
de una manera que devuelve la memoria a la que el programa no hace referencia de otro modo, por lo que __decslpec(restrict) se usa para ayudar al optimizador. Esto es similar a la forma en que los encabezados de CRT decoran funciones de asignación como malloc
mediante __declspec(restrict)
para indicar que siempre devuelven memoria que no puede tener alias de punteros 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);
}
FIN de Específicos de Microsoft
Consulte también
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de