다음을 통해 공유


별칭

Microsoft 전용

noalias함수를 호출 하지 않는 수정 하거나 전역 상태 표시를 참조 하는 메모리에만 수정 directly 포인터 매개 변수로 (1 차 간접 참조).

함수는 다른 이름으로 주석 처리 됩니다 경우 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);
}

참고 항목

참조

__declspec

C + + 키워드