2009-05-07 5 views
21

나는 일반적인 이해가 restrict이지만 몇 가지 좋은 점을 명확히하기를 바라고 있습니다. 한 버퍼에서 null로 끝나는 문자열을 읽고 다른 버퍼에 URL 인코딩 된 버전을 기록하는 함수가 있습니다. 이 함수는 (현재 restrict없이)이 서명이 :제한을 사용할 때와하지 않을 때

char const *StringUrlEncode(char const *unencoded, 
          char *encoded, 
          char *encodedEnd); 

unencoded 내 널 종료 소스 문자열입니다. 위치가 지적를 포함하지 않는 최대하지만 대상 버퍼가 후 첫 문자 으로 버퍼의 제 charencodedencodedEnd 점 버퍼 함수 즉 char의 물품 것이다 encodedencodedEnd로 표시되는 ~에 의해 encodedEnd - 당신이 C++ STL 협약에 익숙하다면 이것은 기본 begin/end 반복자 쌍입니다.

char const *StringUrlEncode(char const *restrict unencoded, 
          char *restrict encoded, 
          char *encodedEnd); 

또는 나는 모든 세 개의 매개 변수에 추가하여 이해 아니에요 몇 가지 이점이있다 :

나는이 기능에 restrict를 추가하는 경우

, 그것은 첫 번째 두 개의 매개 변수에 적용해야 하는가?

입력 및 출력 버퍼를 만들면 restrict은 겹치지 않는다는 것을 컴파일러가 알 수 있도록 도와줍니다. 하지만 마지막 매개 변수 인 encodedEnd은 출력 버퍼의 끝을 표시하는 데 사용되기 때문에 나는 restrict이 컴파일러에 도움이되지 않을 것이라고 생각하고 있습니다. 함수 선언에 불필요한 노이즈).

답변

12

마이크 액턴의 기사 here을 사용해보십시오. Restrict는 사용하지 않을 때 성능에 미치는 영향과이를 잘못 사용했을 때의 결과 때문에 무서운 것입니다.

귀하의 경우에는 동일한 메모리 영역이 아닌 별칭으로 세 포인터 모두에 안전하게 적용 할 수있는 것처럼 들릴 것입니다. 그러나 세 번째 포인터에서 사용하면 성능상의 이점이 거의 없습니다.

+1

마이크 기사를 읽었습니다. (좋은 글자입니다.) –

+1

주어진 링크는 작동하지 않습니다. Google은 http://cellperformance.beyond3d.com/articles/2006/05/demystifying-the-restrict-keyword.html (유효 2009-09-06)에 업데이트 된 버전이 있음을 제안하지만 문제도 있습니다. 캐시 된 버전은 Google에서 사용할 수 있습니다. –

4

당신이 맞다고 생각합니다. 루프 포인터 (p라고 부름)는 루프 끝에서 encodedEnd와 동일합니다. 하지만 아무 것도 루프 뒤에 (p 또는 encodedEnd에서) 액세스 할 필요가 없으므로 문제가되지 않습니다. 나는 아무것도 도움이되지 않을 것이라고 생각합니다. 왜냐하면 아무것도 인코딩 된 것으로부터 읽거나 읽지 못하기 때문입니다. 그래서 최적화 할 것이 없습니다.

하지만 처음 두 가지 제한이 필요하다는 데 동의합니다.

+0

encodedEnd의 역 참조는 인코딩이 또한 제한되므로 정의되지 않은 동작입니다. 따라서 실제로 encodedEnd가 restrict인지 여부는 중요하지 않습니다. – bdonlan

7

이 경우에는 encodedEnd이 제한되는지 여부가 달라지지 않습니다. 어떤 별칭도 인 코드되지 않은으로 인코딩되지 않았 음을 컴파일러에게 약속 했으므로 읽기와 쓰기가 서로 방해하지 않습니다.

이 경우 중요한 제한하는 진짜 이유는없이 컴파일러가 이 영향을 미치지 않습니다인코딩되지 않은을 읽고 인코딩을 씁니다 알 수 없다는 것입니다.예를 들어, 다음 쓰기가 완료 될 때까지 컴파일러는 부하를 예약 할 수 있도록 각,이 인코딩되지 않은에서 각각의 연속 읽기에 영향을 미칠 인코딩 에 기록

encoded == unencoded+1 

경우. restrict는 컴파일러가 두 포인터가 동일한 메모리에 영향을 미치지 않는다는 것을 알려주므로 파이프 라인 스톨을 피하기 위해 충분히 멀리 미리로드를 예약 할 수 있습니다.