restrict 키워드
restrict란?
* 포인터 변수에 사용 가능한 키워드이다.
* restrict는 특정 메모리를 사용하는 포인터가 단 하나임을 뜻한다.
하지만 컴파일러가 이를 무시할 수도 있다.
즉, restrict를 붙인 포인터 변수는 그 메모리를 가리키는 유일한 포인터이다.
유일함에서 오는 장점
* 컴파일러는 코드를 방어적으로 구현하는데 많은 노력을 기울인다.
방어적 구현 중에는 포인터가 가리키는 메모리가 중첩되어 데이터 손실이나
오류가 일어나는 것을 막는 것이 있다.
* 함수 안에서 같은 변수를 3번 사용한다면?
=> 메모리가 겹쳐서 값이 변할 수 있으므로,
컴파일러는 3번 변수를 사용할 때 3번 변수를 호출한다.
* 함수 안에서 restrict가 붙은 변수를 3번 사용한다면?
=> 1번만 호출될 수도 있고, 아닐 수도 있고
* 문자열을 복사할 때
=> 우리는 문자열 복사는 전체를 한꺼번에 복사하는 것이 아니라,
문자 하나하나를 복사하는 것임을 안다.
이때 메모리를 복사하는 곳과 메모리가 복사될 곳에
메모리 중첩이 일어날 수 있으므로, 컴파일러는
확실히 겹치지 않는 공간에 복사본을 만들고
원하는 곳으로 다시 복사를 한다.
* restrict가 붙은 문자열을 복사할 때
=> 중간과정 없이 바로 원하는 위치에 복사할 수도 있고, 아닐 수도 있고
즉, restrict는 프로그래머가 스스로 제약을 걸고, 성능상 이득을 가져올 수 있다.
스스로 거는 제약
* restrict를 붙였지만 메모리가 겹쳐버렸다면?
=> 결과가 정의되지 않음.
1. 컴파일러가 똑똑하게 방어적으로 구현해 주는데, 우리가 이걸 스스로 해제한다?
스스로 안전장치를 뜨는 것과 같다. 위험하다.
2. 메모리가 겹치지 않게 설계했는데, 겹쳤다면 restrict가 중요하냐?
그 함수 자체가 잘못되었으므로 다시 만드는 게 중요하다.
위험할 수 있지만 그런 위험은 restrict가 없어도 예방해야 하는 것.
조심해서 사용하고, 성능상 이득을 보자.
귀여운 그림은 낡은 창고님이 그리셨습니다.
'C' 카테고리의 다른 글
라이브러리 (0) | 2021.02.07 |
---|---|
전역변수 (3) | 2021.02.06 |
전처리기와 매크로 <3> (0) | 2021.02.04 |
전처리기와 매크로 <2> (0) | 2021.02.03 |
전처리기와 매크로 <1> (0) | 2021.02.03 |