2015-01-08 6 views
0

일정한 데이터가있는 경우 (예 : 형태const에 대한 포인터가 __restrict와 같은 효과를 줍니까?

  • double const * const 또는
  • double const *

이 컴파일러에게 __restrict와 동일한 정보를 제공 않는다/그것이 동일한 효과가 있습니까?

내가 이해하는 한, __restrict은 기본적으로 약속 된 데이터가 다른 포인터를 통해/변경되지 않는다고 약속합니다. 그래서, const 값에 대한 포인터는 같은 약속을하게합니다. 그렇죠?

__restrict은 Visual Studio의 키워드를 나타냅니다. 나는 GCC에서 그 의미가 비슷하다고 생각한다.

+0

2 개의 밑줄로 시작하는 '__restrict'는 전체적으로 아키텍처 종속적 인 기능이므로 신중히 사용해야합니다. 일부 컴파일러/언어/구현 기능의 구현에 사용되었음을 나타내는 접두어가 있으므로 프로그래머는 사용하지 말고 클라이언트 소프트웨어에서 사용해서는 안됩니다. 반면에'const'는 컴파일러가 상수의 값을 변경하려고 시도하고 값 오용을 사용자에게 경고하도록 허용하는 표준 언어 기능입니다. –

답변

5

아니요, __restrict은 해당 포인터가 해당 특정 데이터를 가리키는 즉 현재 포인터에서 별칭이 아닌이 아닌 유일한 범위의 포인터임을 의미합니다. 이것은 const과 같지 않습니다. 수정 가능한 데이터가 더 흥미로울 것이라고 생각합니다.

+0

'restrict'는 비 const에 대한 다른 제한된 포인터와 함께 사용될 때'const'에 대한 포인터에 대해 여전히 흥미 롭습니다. 에서'memcpy()'. –

1

const에 대한 포인터가 컴파일러에게 아무 것도 알려주지 않으면 암시 적 변환에 대한 경고를 요청합니다. 객체 자체가 선언 된 경우에만 const (컴파일러는 const이 제거 된 경우에도 변경되지 않은 것으로 가정 할 수 있습니다).

__restrict 반면에 입니다. 이는 컴파일러에게 약속입니다. 즉, 참조 된 개체가 현재 범위의 다른 포인터에 의해 별칭이 지정되지 않습니다.

나는 GCC 문서의 __restrict를 찾을 수 없습니다

하지만 gcc -std=c99 -pedantic은 동일한 의미를 나타내는 int *__restrict foo;int *restrict foo;로 호환 선언을 받아 들인다; 이는 MSVC's __restrict과 같지 않음을 의미합니다. C99 restrict (하지만 MSVC __restrict), I 표준을 읽을 때, const restrict로 유형에 restrict restrict로 포인터가 변경되지 않습니다 참조 된 개체를 약속 않습니다 (포인터가 개체에 액세스하는 데 사용되는 경우)에 대한

, cf. C11 (n1570) 6.7.3.1 p4.