noalias
Spécifique à Microsoft
noalias
signifie qu’un appel de fonction ne modifie pas ou ne référence pas l’état global visible et modifie uniquement la mémoire pointée directement par les paramètres de pointeur (indirections de premier niveau).
Si une fonction est annotée en tant que noalias
, l’optimiseur peut supposer que seuls les paramètres eux-mêmes, et uniquement les indirections de premier niveau des paramètres de pointeur, sont référencés ou modifiés à l’intérieur de la fonction.
L’annotation noalias
s’applique uniquement dans le corps de la fonction annotée. Le marquage d’une fonction comme __declspec(noalias)
n’affecte pas l’alias des pointeurs retournés par la fonction.
Pour obtenir une autre annotation qui peut avoir un impact sur l’alias, consultez __declspec(restrict)
.
Exemple
L’exemple suivant illustre l’utilisation de __declspec(noalias)
.
Lorsque la fonction multiply
qui accède à la mémoire est annotée __declspec(noalias)
, elle indique au compilateur que cette fonction ne modifie pas l’état global, sauf par le biais des pointeurs de sa liste de paramètres.
// 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);
}