noalias
Только для систем Microsoft
noalias означает, что вызов функции не изменяет или не ссылается на видимый глобальное состояние и только изменяет заданную в память directly параметры указателя " (косвенностями первого уровня).
Если к ней, как функция noaliasоптимизатор может предполагать, что, помимо параметров, только сами первого уровня косвенного обращения параметры указателя ссылается или изменяются внутри функции.Видимый глобальное состояние набор всех данных, которые не указаны, либо не существует ссылок вне области компиляции и их адреса, не принимается.Область компиляции все исходные файлы (Параметр /LTCG (создание кода во время компоновки) построение) или один файл-источник (отличных от**/LTCG** построение).
Пример
Следующий пример демонстрирует использование __declspec(restrict) и __declspec(noalias).Как правило, возвращаемая из памяти malloc существует restrict и noalias так как заголовки CRT украшены соответствующим образом.
Однако в данном примере указатели mempool и memptrглобальный поэтому компилятор не имеет обеспечение, что память не подлежит элиайсинг.Украшающ функции, которые возвращают указатели с __declspec(restrict) сообщает компилятору, что память, указанная с псевдонимом к возвращаемому значению.
Украшающ функцию в примере эта память доступа с __declspec(noalias) сообщает компилятору, что эта функция не мешает с глобальным состоянием за исключением посредством указателей в своем списке параметров.
// 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);
}