답변
: 당신은 휘발성 물체가있을 때
, 당신은 휘발성 복사 ctor에 필요합니다. 그래서 문제는 다음과 같습니다. 언제 휘발성 객체가 필요합니까?
휘발성 키워드를 사용하는 주된 이유는 일반적으로 최적화를 비활성화하기 위해서입니다. 즉, 이런 식으로 뭔가가있는 경우입니다 :
bool flag = false;
if(!flag) {}
컴파일러 플래그마다 시간을 확인 할 필요가 없습니다 그래서 플래그를 변경할 수 없습니다 볼 수 있습니다 - 그래서하지 않습니다. 그러나 플래그 변수를 휘발성 변수로 만들면됩니다. 여기
휘발성 키워드 원본 사용의 의견입니다 : 요컨대 link, 원래는 다소 이례적인 일 수있는, MMIO를 통해 하드웨어에 액세스하는 데 사용되었다
unsigned char* pControl = 0xff24 ;
*pControl = 0 ;
*pControl = 0 ;
*pControl = 0 ;
그리고 당신은하지 않습니다 3 가지 과제가 최적화로 인해 하나가되기를 바랍니다.
link이 Alexandrescu의 신문을 비판하는 몇 가지 서류가,하지만 난 그것을 찾을 수 없습니다 :
그리고 여기에 멀티 스레드 소프트웨어의 휘발성에 안드레이 알렉산드 레스 쿠의 논문입니다. 요점은 그가 휘발성 재산 등을 멀리 던지고 있다는 것이 었습니다.
이 멀티 스레딩에 매우 중요한 것은 알고 있어야합니다, @JanHudec 지적 : 그것은 최적화를 방지하면서, 그것은 명시 적 장벽을 생성하지 않기 때문에
volatile
는 멀티 스레드 컨텍스트 완전히 쓸모가 없다. 그리고 한 CPU에서 작성된 쓰기가 없으면 다른 CPU에서 볼 수 없게됩니다 (아키텍처에 따라 다르지만 x86에는 일관된 캐시가 있으므로 쓰기가 항상 표시됩니다).또한
volatile
은 강제로 조작되지 않습니다. x86 할당은 항상 원자 적이지만 모든 CPU 아키텍처에서는 그렇지 않습니다. 그리고 증분과 같은 더 복잡한 연산은std::atomic
을 사용하여 원자 단위로만 만들 수 있습니다.
의견을 사용할 수 없습니다. 유효한 퍼머 링크를 사용해보십시오. – Zeta
@ Zeta - 감사합니다. URL이 어떻게 든 엉망이되었습니다. 편집 됨. –
'volatile'은 다중 쓰레드 컨텍스트에서는 전혀 쓸모가 없습니다. 왜냐하면 최적화를 방해하는 반면 명확한 장벽을 생성하지 않기 때문입니다. 그리고 한 CPU에서 작성된 쓰기가 없으면 다른 CPU에서 볼 수 없게됩니다 (아키텍처에 따라 다르지만 x86에는 일관된 캐시가 있으므로 쓰기가 항상 표시됩니다). –
휘발성 개체가있는 경우 volatile copy-ctor가 필요합니다. 그래서 문제는 다음과 같습니다. 언제 휘발성 객체가 필요합니까? – Nawaz