2013-10-15 7 views
3

제한 키워드에 대한 여러 게시물을 읽었습니다. 그러나 실제로 찾을 수있는 모든 예는 함수와 아마도 단일 값에 대해서만 입력 매개 변수를 참조하는 것처럼 보입니다. 나는 나의 이해를 명확히 할 필요가있다.MSVC++ 키워드 및 로컬 변수를 제한하십시오.

입력 매개 변수와 로컬 변수 모두를 사용하여 키워드의 규칙을 완전히 위반하는 것처럼 보이는 함수를 발견했습니다.

이 함수는 버퍼에 void *를 사용하여 호출되며 포인터는 _restrict (Microsoft Visual C++)로 선언됩니다. 이 함수의 나중에 UCHAR * 유형의 지역 변수 포인터가 선언되고 동일한 제한된 입력 매개 변수 버퍼를 가리 키도록 만듭니다. 여기

내가 이야기하고있는 함수의 심각 아래로 다진 버전에 대한

위의 예는 '제한'의 규칙을 위반 하는가
void Foo(int nVersion, int nX, int nY, int nWidth, void * __restrict pBuffer) const 
{ 
    // ... blah blah blah 
    UCHAR * __restrict pBufferPtr = ((UCHAR *) pBuffer) + 10; // Isn't this aliasing? 
    const void * __restrict pData = (blah blah blah);  //... Get from some function call; 
    memcpy(pBufferPtr, pData, nWidth); 
} 

?

+0

편집 된 제목과 태그는 일반적으로 C++에는 적용 할 수 없기 때문에 하나의 공급 업체의 확장입니다. – aschepler

+0

왜 이것을 MSVC로 태그합니까? Microsoft는 공식적인 측면에서 MSDN에서 제한 키워드 (C 또는 C++ 중 하나)도 지원하지 않는다고 말합니다 – dhein

답변

3

restrict 키워드는 포인터가 고유 한 메모리 부분을 가리켜 야 함을 의미합니다. 위의 코드에서 pBuffer이 가리키고있는 코드는 A이고, pBufferPtr은 이며, PData는 전혀 다른 것으로 나타납니다. B이므로 위반이 없습니다.

+0

앨리어싱되지 않도록 보장되는 유일한 점은 실제 포인터 값 자체와 그것이 가리키는 것이 아니라는 것입니다. 'pBufferPtr'을 'pBuffer + nOffset'으로 초기화하고 'nOffset'이 0이라고 가정합니다. 둘 다 역 참조했다고 가정합니다. 그것은 * pBuffer = 100입니다. UCHAR val = * pBufferPtr; 로드 히트 저장소에 실패하지 않습니까? – user2057722

+1

@ user2057722 이렇게하면 정의되지 않은 동작이 발생합니다. Restrict는 포인터가 고유 한 위치를 가리키고 있다고 가정하여 일부 최적화를 수행 할 수 있도록 컴파일러에게 힌트를 제공합니다. 실제로 프로그래머에게 맡기는 것이 중요합니다. –

+0

그래서 함수는 restrict로 선언 된 포인터에 별명을 지정했거나 (또는 ​​적어도있을 수 있음) 맞습니까? – user2057722

1

C++에는 restrict와 같은 키워드가 없습니다. 또한 예에서 __restrict와 RESTRICT라는 두 가지 단어가 있습니다. 첫 번째 단어는 구현 정의되고 두 번째 단어는 매크로를 나타냅니다. restrict 키워드를 가진 것은 C입니다.

+0

OP는 특히 __restrict를 예약하는 Microsoft Visual-C++를 의미합니다. RESTRICT가 내 대답에 __restrict로 정의되어 있다고 가정합니다. – AndyG

+0

예, 맞습니다. 내 사과. 예제를 간단하게 만들기 위해 RESTRICT의 모든 인스턴스를 __restrict로 바꾸고 RESTRICT를 평가합니다. 나는 지금 그것을 바로 잡았다. – user2057722