noalias
Specyficzne dla firmy Microsoft
noalias oznacza, że wywołania funkcji nie modyfikują lub nie odwołują się do widocznego stanu globalnego i modyfikują tylko pamięć wskazaną do directly, przez parametry wskaźnika (pośrednie pierwszego poziomu).
Jeśli funkcja jest odnotowana, jako noalias, optymalizator może zakładać, że oprócz parametrów, tylko pośrednie parametry wskaźników pierwszego poziomu odwołują się lub modyfikują wewnątrz funkcji.Widoczny stan globalny to zestaw wszystkich danych, które nie są zdefiniowane lub odwołują się poza zakresem kompilacji, a ich adres nie zostanie pobrany.Zakresem kompilacji są wszystkie pliki źródłowe (/LTCG (Generowanie łączonych kodów czasowych) skompilowany) lub pojedynczy plik źródłowy (/LTCG nie skompilowany).
Przykład
Poniższy przykład demonstruje użycie __declspec(restrict) i __declspec(noalias).Normalnie, pamięć zwrócona z malloc jest restrict i noalias ponieważ nagłówki CRT są odpowiednio utrzymane.
Jednak, w tym przykładzie, kursory mempool i memptr są globalne, więc kompilator nie ma pewności, że pamięć nie podlega wygładzaniu.Deklarowanie funkcji, która zwraca wskaźniki z __declspec(restrict) informuje kompilator, która pamięć wskazana do wartości zwracanej, nie jest wygładzana.
Deklarowana funkcja w przykładzie, która uzyskuje dostęp do pamięci z __declspec(noalias) informuje kompilator, że ta funkcja nie koliduje z globalnego stanem, z wyjątkiem wskaźników na jej liście parametrów.
// 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);
}