C언어: Restricted Pointers (C99)
int* restrict p;
위와같이 restrict
키워드가 붙은 포인터는 해당 블록 내에서, 해당 포인터를 통해서만 오브젝트에 접근이 가능하다.
단, 블록 내 하위 블록 내에서 또 다른 restrict
포인터가 선언되면 그 포인터로도 접근 가능하다. (p가 로컬 변수에 해당될 때만)
표준 함수에서의 사용
<string.h>
에 정의된 memcpy()
와 memmove()
의 차이를 통해 알아보자.
void *memcpy(void* restrict s1, const void* restrict s2, size_t n);
void *memmove(void* s1, const void* s2, size_t n);
memcpy()
는 s2
가 가리키는 영역과 s1
이 가리키는 영역이 겹쳐서는 안 된다. 즉 복사의 목적지와 출발지가 겹치면 안 된다. 겹치게 될 경우 Undefined Behavior 가 발생한다. 이 제한이 restrict
키워드를 통해 명시된다.
반면 memmove()
는 해당 제한에서 자유롭다.
실제 프로그래밍 시 restrict
키워드를 사용할 일은 거의 없지만 위와 같이 표준 함수의 프로토타입에서 사용되는 경우가 있으므로 알아두는 것이 좋다.