제한을 사용하는시기와 그렇지 않은시기
-
08-07-2019 - |
문제
나는 일반적인 이해가있다 restrict
그러나 나는 약간의 좋은 점을 명확히하기를 바라고 있습니다. 하나의 버퍼에서 Null-Terminated String을 읽고 다른 버퍼에 URL 인코딩 된 버전을 작성하는 함수가 있습니다. 이 기능에는이 서명이 있습니다 (현재 없음 restrict
):
char const *StringUrlEncode(char const *unencoded,
char *encoded,
char *encodedEnd);
unencoded
내 null이 종결 된 소스 문자열입니다. 대상 버퍼는 표시됩니다 encoded
그리고 encodedEnd
, 어디 encoded
첫 번째를 가리 킵니다 char
버퍼에서 encodedEnd
첫 번째 숯을 가리 킵니다 ~ 후에 버퍼, 즉 함수가 쓸 것입니다 char
s까지 ~를 포함하지 않는 위치는 encodedEnd
- 이것은 당신의 기본입니다 begin
/end
C ++ STL 컨벤션에 익숙한 경우 반복자 쌍.
내가 추가하면 restrict
이 기능에 처음 두 매개 변수에만 적용되는 경우 :
char const *StringUrlEncode(char const *restrict unencoded,
char *restrict encoded,
char *encodedEnd);
아니면 세 매개 변수 모두에 추가하여 이해하지 못하는 이점이 있습니까?
입력 및 출력 버퍼를 만드는 것을 볼 수 있습니다. restrict
컴파일러가 겹치지 않는다는 것을 알도록 도와줍니다. 그러나 마지막 매개 변수 이후 encodedEnd
, 출력 버퍼의 끝을 표시하는 데만 사용됩니다. restrict
컴파일러에 대한 도움이되지는 않을 것입니다 (기능 선언에 불필요한 노이즈를 추가하는 것 외에는 아프지 않을 것이라고 생각하지만).
해결책
Mike Acton의 기사를 사용해보십시오 여기. 사용하지 않는 성능의 영향과 잘못 사용의 결과로 인해 제한이 무섭습니다.
귀하의 경우, 동일한 메모리 영역에 별명이 없으므로 세 포인터 모두에 안전하게 제한을 적용 할 수있는 것처럼 들립니다. 그러나 세 번째 포인터에서 사용하면 성능 이점이 거의 없거나 전혀 없습니다.
다른 팁
이 특별한 경우에는 차이가 없습니다. 인코딩 제한적이든 아니든; 당신은 컴파일러가 아무도 별명이 없다고 약속했습니다 인코딩되지 않은 그리고 인코딩, 그래서 읽기와 쓰기는 서로를 방해하지 않습니다.
이 경우 제한이 중요한 진짜 이유는 그것 없이는 컴파일러가 인코딩 읽기에 영향을 미치지 않습니다 인코딩되지 않은. 예를 들어, if
encoded == unencoded+1
그런 다음 각각 글을 씁니다 인코딩 각 후속 읽기에 영향을 미칩니다 인코딩되지 않은, 따라서 컴파일러는 쓰기가 완료 될 때까지로드를 예약 할 수 없습니다. 제한은 두 포인터가 동일한 메모리에 영향을 미치지 않는다는 컴파일러를 약속하므로 파이프 라인 스톨을 피하기 위해 미리로드를 예약 할 수 있습니다.
나는 당신이 아프지 않을 것이라고 옳다고 생각합니다. 루프 포인터 (P 호출)는 루프 끝에서 인코딩과 동일합니다. 그러나 루프 후 (P 또는 인코딩에서) 액세스 할 필요는 없으므로 문제가되지 않아야합니다. 인코딩에서 쓰여지거나 읽은 것이 없기 때문에 최적화 할 것이 없기 때문에 그것이 도움이 될 것이라고 생각하지 않습니다.
그러나 나는 당신이 처음 두 가지 제한이 실제로 도움이되어야한다는 데 동의합니다.