- 영어단어 뜻은, "휘발성의", "순간적인" 이다.
컴파일러의 눈에는 현재 프로그램 소스만 보이기 때문에 변수가 다른 요소에 의해서 변한다는 것을 이해할 수 없다. 초기화된 값만이 변수에 할당되었을 뿐 그 이후로는 값의 변화가 없다고 판단한다. 이러한 이유 떄문에 최적화를 수행하면 메모리로부터 새로운 값을 읽어오지 않고 기존의 초기값으로 프로그램을 수행시킨다.
volatile의 기능적 의미는 캐시사용한함이다. 보통 프로그램이 실행될 떄 속도를 위해 필요한 데이터를 메모리에서 직접 읽어오지 않고 캐시로 부터 읽어온다. 하지만, 하드웨어에 의해서 변경되는 값들은 캐시에서 즉각적으로 반영되지 않으므로 데이터를 캐시로부터 읽어오지 말고 주 메모리에서 직접 읽어오도록 해야한다. 이러한 특성 떄문에 하드웨어가 사용하는 메모리는 volatile로 선언해야 하드웨어에 의해 변경된 값들이 프로그램에 제대로 반영된다.
즉, volatile은 캐시를 사용하지 않는 특성 외에 컴파일러 최적화가 임의로 코드를 변경하는 것을 막을 수 있다.
----------------------------------------------------------------------------------------------------
요약하자면 1970년대에 Gordon Bell이 memory-mapped I/O 개념을 소개하면서 compiler optimazation에 의해 의도하지 않은 결과가 발생하기 때문에 이를 막기 위해 volatile의 필요성이 제기됨.
다음과 같은 상황에서 volatile이 필요함.
- variable의 값이 ‘unstable’한 경우 - 컴파일러도 모르는 어떤 방법으로 값이 변경 (MMIO처럼..)
- volatile 성격의 data에 대한 write는 ‘observable’하므로 엄격하게 실행되어야 함
- volatile data에 대한 모든 operation은 소스코드에 나타난 대로 순차적으로 실행되어야 함.
'소프트웨어 > C언어' 카테고리의 다른 글
더블 포인터 (0) | 2011.07.28 |
---|---|
Heap, Stack 구조 (0) | 2011.07.18 |
구조체_컴파일러최적화 (0) | 2011.06.21 |
Return (0) | 2011.06.21 |
구조체 멤버변수 접근방법 (0) | 2011.06.21 |