C 언어 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.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Visual Studio/WPF > (clickedHeader.Column.DisplayMemberBinding as Binding).Path.Path운영 환경 를 바탕으로 학습 중. MainWindow.xaml.cs MainWindow.xaml 신경이 쓰이는 부분 이하가 신경이 쓰인 부분. 이 이중의 ".Path"는 무엇이 될 것인가. 브레이크 포인트에서 멈추어...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.