/ C, PROGRAMMING

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 키워드를 사용할 일은 거의 없지만 위와 같이 표준 함수의 프로토타입에서 사용되는 경우가 있으므로 알아두는 것이 좋다.