noalias
Específicos do Microsoft
noaliassignifica que uma chamada de função não modificar ou visível estado global de referência e modifica somente a memória apontada directly pelos parâmetros de ponteiro (indirections de primeiro nível).
Se uma função for anotada como noalias, o otimizador pode assumir que, além os parâmetros propriamente ditos, indirections de primeiro nível apenas dos parâmetros de ponteiro são referenciados ou modificados dentro da função.O estado de visibilidade global é o conjunto de todos os dados que não está definida ou referenciada fora do escopo de compilação e seus endereços não for tomado.O escopo de compilação é todos os arquivos de origem (/ /LTCG (geração de código Link-time) baseia-se) ou um único arquivo de origem (não-/LTCG build).
Exemplo
O exemplo a seguir demonstra o uso de __declspec(restrict) e __declspec(noalias).Normalmente, a memória retornado de malloc é restrict e noalias porque os cabeçalhos de CRT são decorados apropriadamente.
No entanto, no exemplo, os ponteiros mempool e memptr são globais, para que o compilador não tem nenhuma garantia de que a memória não está sujeito a suavização de bordas.Decorando as funções que retornam ponteiros com __declspec(restrict) informa ao compilador que a memória apontada pelo valor de retorno não é um alias.
Decorar a função de exemplo que acessa a memória com __declspec(noalias) informa ao compilador que esta função não interfere com o estado global, exceto através de ponteiros de em sua 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;
__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);
}