noalias
Programu Microsoft
noaliasoznacza, że wywołania funkcji nie zmodyfikować lub odwołać widoczne stanu globalnego i modyfikuje tylko pamięci wskazywanej directly przez wskaźnik parametry (pierwszego poziomu indirections).
Jeśli funkcja jest oznaczony jako noalias, optymalizator można przyjąć, że oprócz same parametry indirections tylko pierwszy poziom wskaźnika parametrów są odwołania lub modyfikowane wewnątrz funkcji.Widoczny stan globalny to zestaw wszystkich danych, które nie jest zdefiniowane lub wywoływane poza zakresem kompilacji i ich adres nie jest brana.Zakres kompilacji jest wszystkie pliki źródłowe (/ LTCG (generowanie kodu czasu łącza) buduje) lub w jednym pliku źródłowym (non-/LTCG tworzenie).
Przykład
Poniższy przykład demonstruje użycie __declspec(restrict) i __declspec(noalias).Zwykle pamięci zwrócony z malloc jest restrict i noalias ponieważ nagłówki CRT są odpowiednio.
Jednakże, w tym przykładzie kursory mempool i memptr są globalne, więc kompilator nie ma gwarancji, że pamięć nie podlega wygładzanie.Dekoracja funkcji, które zwracają wskaźniki z __declspec(restrict) informuje kompilator, że pamięci wskazywanej przez wartości zwracanej nie jest aliasu.
Dekoracja funkcji w przykładzie, który uzyskuje dostęp do pamięci z __declspec(noalias) informuje kompilator, że ta funkcja nie koliduje z globalnego Państwa, z wyjątkiem poprzez wskaźniki w jego 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);
}