C 언어 restrict 키워드 의 사용 에 대한 간단 한 설명

3478 단어 restrict키워드
C99 에 restrict 수식 지침 이 새로 추가 되 었 습 니 다.
restrict 로 장 식 된 지침 은 최초 로 지침 이 가리 키 는 대상 을 액세스 하 는 유일한 방법 으로 두 번 째 지침 이 첫 번 째 를 기반 으로 할 때 만 대상 을 액세스 할 수 있 습 니 다.대상 에 대한 접근 은 모두 restrict 에 의 해 수 정 된 포인터 표현 식 에 한정 되 어 있 습 니 다.
restrict 에서 수식 하 는 지침 은 주로 함수 형 인삼 이나 malloc()에서 분 배 된 메모리 공간 을 가리 키 는 데 사 용 됩 니 다.restrict 데이터 형식 은 프로그램의 의 미 를 바 꾸 지 않 습 니 다.컴 파일 러 가 restrict 수식 지침 을 만 드 는 것 은 액세스 대상 의 유일한 방법 이라는 가설 을 통 해 특정한 유형의 루틴 을 최적화 시 킬 수 있다.
restrict 는 c99 표준 으로 도입 되 었 습 니 다.포인터 만 한정 하고 제약 할 수 있 으 며,포인터 가 데이터 대상 에 접근 하 는 유일한 초기 방식 임 을 나타 냅 니 다.즉,컴 파일 러 에 게 이 포인터 가 가리 키 는 메모리 의 내용 을 수정 하 는 모든 작업 은 이 지침 을 통 해 수정 해 야 하 며,다른 경로(다른 변수 나 지침)를 통 해 수정 할 수 없습니다.이렇게 하 는 장점 은 컴 파일 러 가 더욱 좋 은 최적화 코드 를 만 들 고 더욱 효율 적 인 어 셈 블 리 코드 를 만 드 는 데 도움 을 줄 수 있다 는 것 이다.예 를 들 어
int *restrict ptr,
ptr 가 가리 키 는 메모리 셀 은 ptr 에 만 접근 할 수 있 습 니 다.이 메모리 셀 을 가리 키 는 다른 지침 은 정의 되 지 않 았 습 니 다.직 설 적 인 점 은 잘못된 지침 입 니 다.
restrict 의 등장 은 C 언어 자체 의 고유 한 결함 때 문 입 니 다.C 프로그래머 는 자발적으로 이 결함 을 피해 야 하고 컴 파일 러 도 코드 를 최적화 시 킬 것 입 니 다.
예:

int ar[10];
int * restrict restar=(int *)malloc(10*sizeof(int));
int *par=ar;
for(n=0;n<10;n++)
{
    par[n]+=5;
    restar[n]+=5;
    ar[n]*=2;
    par[n]+=3;
    restar[n]+=3;
}
restar 는 분 배 된 메모리 에 접근 하 는 유일한 초기 방식 이기 때문에 컴 파일 러 는 상기 restar 작업 을 최적화 할 수 있 습 니 다.restar[n]+=8;
한편,par 는 배열 ar 를 방문 하 는 유일한 방식 이 아니 기 때문에 다음 과 같은 최적화 가 불가능 합 니 다.par[n]+=8;
par[n]+=3 전에 AR[n]*=2 가 바 뀌 었 기 때문이다.키워드 restrict 를 사용 하면 컴 파일 러 가 안심 하고 최적화 할 수 있 습 니 다.키워드 restrict 에는 두 명의 독자 가 있다.하 나 는 컴 파일 러 로 컴 파일 러 에 게 최적화 와 관련 된 가정 을 자 유 롭 게 할 수 있다 고 알려 준다.또 다른 독 자 는 사용자 이다.그 는 사용자 에 게 restrict 요 구 를 만족 시 키 는 매개 변수 만 사용 하 라 고 말 했다.
일반적으로 컴 파 일 러 는 이 제한 을 따 랐 는 지 확인 할 수 없습니다.이 제한 을 무시 하면 모험 을 하 는 것 입 니 다.To help the compiler determine memory dependencies, you can qualify a pointer, reference, or array with the restrict keyword. The restrict keyword is a type qualifier that may be applied to pointers, references, and arrays. Its use represents a guarantee by the programmer that within the scope of the pointer declaration the object pointed to can be accessed only by that pointer.
Any violation of this guarantee renders the program undefined. This practice helps the compiler optimize certain sections of code because aliasing information can be more easily determined.
 
Use of the restrict type qualifier with pointers

void func1(int * restrict a, int * restrict b)
{
  /* func1's code here */
}
In the example that follows, the restrict keyword is used to tell the compiler that the function func1 is never called with the pointers a and b pointing to objects that overlap in memory. You are promising that accesses through a and b will never conflict; this means that a write through one pointer cannot affect a read from any other pointer. The precise semantics of the restrict keyword are described in the 1999 version of the ISO C standard.
Use of the restrict type qualifier with arrays

void func2(int c[restrict], int d[restrict])
{
  int i;

  for(i = 0; i < 64; i++)
  {
    c[i] += d[i];
    d[i] += 1;
  }
}

This example illustrates using the restrict keyword when passing arrays to a function. Here, the arrays c and d should not overlap, nor should c and d point to the same array.

좋은 웹페이지 즐겨찾기