noalias
Microsoft 전용
noalias
는 함수 호출이 표시되는 전역 상태를 수정하거나 참조하지 않으며 포인터 매개 변수(첫 번째 수준 간접 참조)로 직접 가리키는 메모리만 수정한다는 것을 의미합니다.
함수에 주석이 추가 noalias
된 경우 최적화 프로그램은 매개 변수 자체와 포인터 매개 변수의 첫 번째 수준 간접 참조만 함수 내에서 참조되거나 수정된다고 가정할 수 있습니다.
주석은 noalias
주석이 추가된 함수의 본문 내에서만 적용됩니다. 함수를 표시 __declspec(noalias)
해도 함수에서 반환하는 포인터의 별칭에는 영향을 주지 않습니다.
별칭에 영향을 미칠 수 있는 다른 주석은 다음을 참조하세요 __declspec(restrict)
.
예시
다음 샘플에서는 .의 __declspec(noalias)
사용을 보여 줍니다.
메모리에 액세스하는 함수 multiply
에 주석이 추가되면 __declspec(noalias)
이 함수는 매개 변수 목록의 포인터를 제외하고는 전역 상태를 수정하지 않는다는 것을 컴파일러에 알릴 수 있습니다.
// declspec_noalias.c
#include <stdio.h>
#include <stdlib.h>
#define M 800
#define N 600
#define P 700
float * mempool, * memptr;
float * ma(int size)
{
float * retval;
retval = memptr;
memptr += size;
return retval;
}
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);
}
참고 항목
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기