C++에는 restrict 키워드가 존재하지 않습니다
결론부터 말씀드리면, C++ 표준에는 restrict라는 키워드가 없습니다. C++ 언어 표준 문서의 2.11/1절에서 공식 키워드 목록을 확인할 수 있는데, 여기에는 restrict가 포함되어 있지 않습니다. 이 키워드는 C99 버전의 C 언어에서 도입된 것으로, C++ 언어 사양에는 속하지 않습니다.
C 언어에서 restrict의 의미
C 언어에서 restrict 한정자(qualifier)가 붙은 포인터는 컴파일러에 대한 일종의 '약속'입니다. 해당 포인터가 유효한 범위(scope) 내에서, 포인터가 가리키는 대상은 오직 그 포인터(그리고 그로부터 복사된 포인터)를 통해서만 접근된다는 것을 보장합니다.
이 약속 덕분에 컴파일러는 에일리어싱(aliasing), 즉 서로 다른 포인터가 같은 메모리를 가리키는 상황을 걱정하지 않고 더 공격적인 최적화를 수행할 수 있습니다. 예를 들어 배열 연산 시 메모리 영역이 겹치지 않는다고 확신할 수 있기 때문에, 명령어 재배치나 벡터화(vectorization) 같은 성능 개선이 가능해집니다.
C++ 컴파일러에서의 지원 현황
흥미롭게도 대부분의 C++ 컴파일러 역시 최적화 목적으로 이 정의를 지원합니다. 다만 공식 키워드가 아니라 확장(extension) 형태로 제공됩니다.
- GCC / Clang:
__restrict__또는__restrict - MSVC:
__restrict
즉, C++ 컴파일러들도 최적화를 위해 동일한 개념을 활용하고는 있지만, 이는 공식 C++ 언어 사양의 일부가 아니라는 점을 유의해야 합니다. 컴파일러마다 키워드 이름과 세부 동작이 다를 수 있으므로, 코드의 이식성(portability)을 고려한다면 사용 시 주의가 필요합니다.