Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Específico de Microsoft
noalias significa que una llamada de función no modifica el estado global visible ni hace referencia a él y solo modifica la memoria designada directamente por los parámetros de puntero (direccionamientos indirectos de primer nivel).
Si una función está anotada como noalias, el optimizador puede suponer que, solo los parámetros en sí mismos, dentro de la función y solo los direccionamientos indirectos de primer nivel de los parámetros del puntero se modifican o se hace referencia a ellos.
La anotación noalias solo se aplica dentro del cuerpo de la función anotada. Marcar una función como __declspec(noalias) no afecta al alias de punteros devueltos por la función.
Para obtener otra anotación que pueda afectar al alias, consulte __declspec(restrict).
Ejemplo
En el ejemplo siguiente se muestra el uso de __declspec(noalias).
Cuando la función multiply que accede a la memoria con está anotada como __declspec(noalias), se le indica al compilador que esta función no modifica el estado global excepto a través de los punteros en su lista de parámetros.
// declspec_noalias.c
#include <stdio.h>
#include <stdlib.h>
#define M 800
#define N 600
#define P 700
float * mempool, * memptr;
float * ma(int size)
{
float * retval;
retval = memptr;
memptr += size;
return retval;
}
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.1/k++;
return a;
}
__declspec(noalias) 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);
}