본문 바로가기
【👨‍💻 Programming 】/C

restrict type qualifier

반응형
*출처: http://superkkt.com/291

 
void *memcpy(void *restrict s1, const void *restrict s2, size_t n);

위 선언에서 restrict라는 구문이 있다. 표준 함수들의 선언에 보면 아주 많이 등장을 하는데, 이것은 C99 표준에 추가된 내용으로서 함수 안에서 각각의 인자로 전달된 포인터들이 서로 독립적인 영역을 가르키고 있다는것을 보장해 준다. 위에서 예로 든 memcpy 함수에 전달되는 인자는 서로 중복되는 영역을 포인팅해서는 안된다.

이것을 사용하는 이유는 최적화와 관련이 있다. 바로 포인터가 최적화를 방해하는 요소이기 때문이다. 포인터는 어떠한 곳을 가르키고 있을지 모르기 때문에 컴파일러가 임의로 최적화를 하면 프로그래머가 의도하지 않은 결과가 나타날 수 있다.

특히 두 개 이상의 포인터가 서로 같은 곳을 가르키고 있는 경우 문제가 생긴다.그래서 컴파일러는 안정성이 최우선이기 때문에 조금이라도 의심이 되는 경우에는 최적화를 수행하지 않는다.

그래서 restrict라는 type qualifier를 사용해서 컴파일러에게 이 포인터들은 서로 겹치지 않은 독립적인 영역을 포인팅 한다고 힌트를 주면, 컴파일러가 최적화를 하는데 도움을 줄 수 있다. 하지만 이것은 단지 힌트를 주는 것이지 꼭 최적화가 된다는 보장은 없다고 한다. 부가적으로 해당 함수를 사용하는 프로그래머에게 이 함수에 전달되는 포인터들은 겹치는 영역을 포인팅해서는 안된다는 메세지를 전달할 수도 있다.

마지막으로 함수에 전달되는 인자가 서로 겹치는 메모리 영역을 포인팅해도 되는 함수의 선언을 한번 보자. 예상대로 restrict type qualifier가 없다. :-)

void *memmove(void *s1, const void *s2, size_t n);


<참조>

http://minjang.egloos.com/1712295
http://kjs1981.tistory.com/tag/Restrict%20%ED%95%9C%EC%A0%95%EC%96%B4

반응형