2011-08-03 4 views

답변

16

The article mentioned in this blog post Herb Sutter가 간결하고 명확하게 설명하고 C, C++, Java 및 C#의 휘발성의 사용법과 의미를 비교합니다.

EDIT : 초기 링크 (Herb Sutter의 블로그 링크)에 언급 된 DDJ 기사에 "exact link"이라고 혼동하지 마십시오.

또한 Nigel Jones의 this article은 embedded C 프로그래밍의 맥락에서 volatile 키워드를 설명합니다. 이 질문은 인터뷰에서 같은 저자가 작성한 this other article이 팝업창으로 나타나서 내 즐겨 찾기 ("exact link") 중 하나이며 C 세계에서 휘발성에 대한 또 다른 좋은 설명이 있습니다.

int running = 1; 
void run() { 
    while (running) { 
     // Do something, but 'running' is not used at all within the loop. 
    } 
} 

는 일반적으로 컴파일러가 번역 할 수있다 '동안 (달리기)'단지 '동안 (1)'이 경우 : 휘발성 C에서

+0

귀하의 링크를 따라 차이가 없습니다. –

+1

@Luis Filipe 정확히 이해하지 못 했습니까? C/C++에서는 "비정상적인 메모리 의미"(HW 레지스터, 하나 이상의 주소에서의 메모리 설명)에 사용되는 반면 Java/.NET (C#)에서는 volatile free가 잠금없는 프로그래밍에 사용됩니다. – celavek

+0

실제 ddj 문서를 따라야합니다. 연결하기가 쉬운 지 (광고) 모르겠다. –

2

변수에 대한 액세스를 최적화하지 않도록 컴파일러를 알려줍니다. 'running'변수가 volatile로 표시되면 컴파일러는 매번 변수를 확인해야합니다.

C '휘발성'은 하드웨어 (예 : CPU 캐시, 명령 파이프 라인 등)가 여전히 메모리 액세스를 재정렬하는 동안 컴파일러를 최적화하는 것을 제한한다는 것을 이해하는 것이 중요합니다. C 컴파일러가 하드웨어를 최적화하지 말라고 알리는 방법은 없습니다. 스스로를해야합니다 (예 : 메모리 장벽 사용). 당신은 휘발성 변수에 작성하는 경우

  • ,이 보장됩니다 모든 메모리는 것을 액세스하는 :

    는 지금까지 내가 (하지만 난 완전히 확실하지 않다) 알고있는 C#을 사양은 조금 더이 소요 그것이 완료되기 전에해라.

  • 휘발성 변수를 읽으면 휘발성 변수의 읽기가 완료되기 전에 완료되지 않은 모든 메모리 액세스가 완료된다는 것을 보장합니다.