2010-06-12 3 views
11

나는 그것이 가능하다는 것을 알았지 만 나는 그 이해를 이해하지 못한다.volatile에 대한 const_cast <>의 목적은 무엇입니까?

+0

'const volatile'에서 'volatile'또는 다른 것으로 캐스팅하는 것에 대해 묻는 중입니까? –

+0

항상 그렇듯이 일부 코드를 게시하면 도움이됩니다. –

+0

C 언어에'const_cast <> '가 없으므로 C 태그가 제거되었습니다. –

답변

22

여기에 대한 세부 오히려 음란 한 양의로 전환 안드레이 Alexandrescu에 의한 Dr. Dobbs article을합니다.

+0

대단히 흥미로운 기사입니다. Upvoted. – Puppy

+0

알렉산드레스쿠 (Alexandrescu)가 작성한 많은 다른 것들과 마찬가지로 그 기사는 계몽적입니다. 나는 그 기사와 그가 얼마 전 제안한 '휘발성 (volatile)'한정어의 남용에 관한 질문을했다. http://stackoverflow.com/questions/2491495/may-volatile-be-in-user-defined-types-to- help-writing-thread-safe-code –

+0

실제로 훌륭한 기사입니다. 공유해 주셔서 감사합니다. +1. – jweyrich

3

constvolatile 소리는 변수에 같은 생각을 지칭하지만, 그들은하지 않습니다. const 변수는 현재 코드로 변경할 수 없습니다. volatile 변수는 현재 코드 외부의 일부 외부 엔티티에 의해 변경 될 수 있습니다. const volatile 변수 (특히 메모리 매핑 레지스터와 같은)를 사용하면 프로그램에서 예측할 수없는 시간에 컴퓨터에서 변경되지만 코드를 직접 변경할 수는 없습니다. const_cast을 사용하여 const 또는 volatile ("cv-qualification")을 변수에 추가하거나 제거 할 수 있습니다.

4

constvolatile은 직교한다.

const은 데이터가 읽기 전용임을 의미합니다.

volatile은 외부 이유로 인해 변수가 변경 될 수 있으므로 컴파일러가 참조 할 때마다 메모리에서 변수를 읽어야합니다.

따라서 const을 제거하면 읽기 전용 위치 인 코드를 작성할 수 있습니다. 코드는 위치를 실제로 수정할 수있는 특별한 지식이 있어야합니다. 당신은 정의되지 않은 동작이 발생할 수 있기 때문에 volatile가 작성 제거 안 (7.1.5.1/7으로 인해 - If an attempt is made to refer to an object defined with a volatile-qualified type through the use of an lvalue with a non-volatile-qualified type, the program behaviour is undefined.)

+2

'const_cast'는'const'와'volatile' 모두에 적용될 수 있습니다. 잠재적으로'volatile'을 제거하면 정의되지 않은 동작이 발생할 수 있습니다 , 그렇지 않은 경우가 있습니다. 나는. 메모리 장벽을 추가하면 컴파일러가 변수를 캐싱하지 않게되어 변수가 캐시되지 않고 중요한 섹션 외부에서 재 배열되지 않게되므로 '휘발성'이라는 강력한 보장을 제공합니다. –

관련 문제