noalias
Spécifique à Microsoft
noalias signifie qu'un appel de fonction ne change pas ou ne référence pas l'état global visible et modifie uniquement la mémoire vers lequel directly par les paramètres de pointeur (indirections de premier niveau).
Si une fonction est annotée comme noalias, l'optimiseur peut prendre que, en plus de les paramètres eux-mêmes, uniquement des indirections de premier niveau des paramètres de pointeur sont référencées ou modifiées à l'intérieur de la fonction.L'état global visible est l'ensemble de toutes les données qui n'est pas définie ou n'est pas référencée en dehors de la portée de compilation, et leur adresse n'est pas prise.La portée de compilation est tous les fichiers sources (générations de/LTCG (Génération de code durant l'édition de liens) ) ou un fichier source unique (génération est possible d'/LTCG ).
Exemple
L'exemple suivant illustre l'utilisation __declspec(restrict) et __declspec(noalias).Normalement, la mémoire retournée à partir de malloc est restrict et noalias parce que les en-têtes CRT sont décorés de manière appropriée.
Toutefois, dans cet exemple, les pointeurs mempool et memptrsont globaux le compilateur n'a aucune assurance que la mémoire n'est pas objet d'alias.Décorant des fonctions que les pointeurs de retour avec __declspec(restrict) indique au compilateur que la mémoire désignée par la valeur de retour pas alias.
Décorant la fonction de l'exemple que la mémoire d'accès avec __declspec(noalias) indique au compilateur que cette fonction ne dérange pas l'état global que via les pointeurs dans 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;
__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.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);
}