문제

나는 일반적인 이해가있다 restrict 그러나 나는 약간의 좋은 점을 명확히하기를 바라고 있습니다. 하나의 버퍼에서 Null-Terminated String을 읽고 다른 버퍼에 URL 인코딩 된 버전을 작성하는 함수가 있습니다. 이 기능에는이 서명이 있습니다 (현재 없음 restrict):

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

unencoded 내 null이 종결 된 소스 문자열입니다. 대상 버퍼는 표시됩니다 encoded 그리고 encodedEnd, 어디 encoded 첫 번째를 가리 킵니다 char 버퍼에서 encodedEnd 첫 번째 숯을 가리 킵니다 ~ 후에 버퍼, 즉 함수가 쓸 것입니다 chars까지 ~를 포함하지 않는 위치는 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 또는 인코딩에서) 액세스 할 필요는 없으므로 문제가되지 않아야합니다. 인코딩에서 쓰여지거나 읽은 것이 없기 때문에 최적화 할 것이 없기 때문에 그것이 도움이 될 것이라고 생각하지 않습니다.

그러나 나는 당신이 처음 두 가지 제한이 실제로 도움이되어야한다는 데 동의합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top