동일 메모리 블럭을 가르키지 못하게 막는 restrict라는 키워드를 처음 보았는데요.
이 키워드가 안먹히던데 왜그런건가요?
컴파일러는 vs2012입니다.
http://msdn.microsoft.com/en-us/library/5ft82fed(v=vs.110).aspx
참고로 restrict는 C99 표준으로, C++에는 아직 표준도입이 안돼서 각 컴파일러마다 비슷한 녀석을 하나씩 가지고 있는 것으로 알고 있습니다.
--
아.
그렇군요.
그럼 당장은 const를 사용하는 것이 최선인가요?
const와 restrict는 전혀 의미가 다릅니다.
const가 막지못하는 포인터 캐스팅 꼼수를 restrict가 막는것 아닌가요?
무엇을 상상하시는지는 잘 모르겠습니다만, restrict는 "포인터 캐스팅을 막는" 것과는 전혀 관계가 없는데요.
restrict는 "이걸 쓰면 부르는 쪽이 xxx 못하게 막아주겠다" 이런 의미가 아니라, 완전히 반대로 "이걸 쓰는 것은 부르는 쪽이 xxx를 안한다고 보장해 준다는 것을 뜻한다. (그러니까 함수 안에서는 xxx가 절대 안 일어난다고 가정해도 좋으니 안심하고 최적화 마구 해라.)"라는 뜻입니다.
아 그런 뜻이군요..
답변 감사합니다.
근데 윗분말씀대로 요놈은 사용상에 제약을 거는 키워드가 아니고, 컴파일러의 최적화를 돕는 키워드입니다. 저 키워드를 쓰고 나서 정작 쓰는쪽에서 저 제약을 지키지 않으면 명시적인 에러가 나오는 것이 아니고 프로그램이 오동작을 하게 됩니다.
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
이거 찾으시는게 맞나요? 이름이 조금 다릅니다.
http://msdn.microsoft.com/en-us/library/5ft82fed(v=vs.110).aspx
참고로 restrict는 C99 표준으로, C++에는 아직 표준도입이 안돼서 각 컴파일러마다 비슷한 녀석을 하나씩 가지고 있는 것으로 알고 있습니다.
--
아. 그렇군요. 그럼 당장은 const를 사용하는
아.
그렇군요.
그럼 당장은 const를 사용하는 것이 최선인가요?
...
const와 restrict는 전혀 의미가 다릅니다.
const가 막지못하는 포인터 캐스팅 꼼수를
const가 막지못하는 포인터 캐스팅 꼼수를 restrict가 막는것 아닌가요?
...
무엇을 상상하시는지는 잘 모르겠습니다만, restrict는 "포인터 캐스팅을 막는" 것과는 전혀 관계가 없는데요.
restrict는 "이걸 쓰면 부르는 쪽이 xxx 못하게 막아주겠다" 이런 의미가 아니라, 완전히 반대로 "이걸 쓰는 것은 부르는 쪽이 xxx를 안한다고 보장해 준다는 것을 뜻한다. (그러니까 함수 안에서는 xxx가 절대 안 일어난다고 가정해도 좋으니 안심하고 최적화 마구 해라.)"라는 뜻입니다.
아 그런 뜻이군요.. 답변 감사합니다.
아 그런 뜻이군요..
답변 감사합니다.
그냥 __restrict를 쓰시면 되지요..
근데 윗분말씀대로 요놈은 사용상에 제약을 거는 키워드가 아니고, 컴파일러의 최적화를 돕는 키워드입니다. 저 키워드를 쓰고 나서 정작 쓰는쪽에서 저 제약을 지키지 않으면 명시적인 에러가 나오는 것이 아니고 프로그램이 오동작을 하게 됩니다.
--
댓글 달기