이번 글에서는 C 언어의 restrict 키워드가 무엇인지 살펴보겠습니다. restrict 키워드는 C99 표준에서 처음 도입되었으며, 컴파일러 최적화와 밀접한 관련이 있는 키워드입니다. 그럼 restrict 키워드가 실제로 어떤 역할을 하는지 자세히 알아보겠습니다.
타입 한정자로 사용: restrict 키워드는 포인터 선언 시 포인터의 타입 한정자(qualifier)로 사용됩니다.
새로운 기능을 추가하지 않음: 이 키워드 자체는 새로운 기능을 제공하지 않습니다. 대신 프로그래머가 컴파일러에게 수행 가능한 최적화에 대한 정보를 전달하는 역할을 합니다.
유일한 접근 경로임을 보장: 포인터 p에 restrict 키워드를 붙이면, 해당 포인터가 가리키는 객체에는 오직 이 포인터를 통해서만 접근한다는 사실을 컴파일러에 알려줍니다. 따라서 컴파일러는 별도의 추가 검사 없이 더 공격적인 최적화를 수행할 수 있습니다.
조건 위반 시 정의되지 않은 동작 발생: 만약 프로그래머가 restrict 키워드를 사용하면서 위 조건을 위반하면, 정의되지 않은 동작(undefined behavior)이 발생할 수 있습니다.
예제 코드
#include <stdio.h>
void my_function(int* x, int* y, int* restrict z) {
*x += *z;
*y += *z;
}
main(void) {
int x = 10, y = 20, z = 30;
my_function(&x, &y, &z);
printf("%d %d %d", x, y, z);
}
실행 결과
40 50 30
위 예제에서 z는 restrict로 선언되어 함수 내부에서 z가 가리키는 값에 접근하는 유일한 경로입니다. my_function이 실행되면 x는 10+30으로 40이 되고, y는 20+30으로 50이 되며, z는 변경되지 않으므로 그대로 30이 출력됩니다.