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);
}

참고 항목

__declspec
키워드
__declspec(restrict)