http://ko.wikipedia.org/wiki/Volatile_%EB%B3%80%EC%88%98
이 키워드는 컴파일러의 재량을 제한하는 역할
volatile가 선언된 변수는 최적화에서 제외된다.
지정한 주소를 직접 액세스하는 방식을 지정할 수도 있다.
예)
static int foo;
void bar(void)
{
foo = 0;
while (foo != 255);
}
컴파일러는 다음과 같이 최적화한다.
void bar_optimized(void)
{
foo = 0;
while (true);
}
이렇게 되면 무한 루프가 된다.
최적화를 위해 다음과 같이 한다.
static volatile int foo;
void bar (void)
{
foo = 0;
while (foo != 255);
}
이렇게 하면 개발자가 의도한대로 기계어 코드가 생성된다.
이프로그램만으로는 무한루프라고 생각할 수 있지만,
만약 foo가 하드웨어 레지스터라면, 하드웨어에 의해 값이 변할 수 있다.
즉, 하드웨어 값을 poll(폴링)할때 사용한다.