98.7.18 조경민

volatile 키워드

volatile int a;

이렇게 선언하면 a는 컴파일러 최적화를 하지 않는다.

-> 컴파일러 최적화는

int  a=1;
while(a)
{
    printf("Hello");  
}

이런경우 변수 a의 값은 while 안에서 변하게 하는 조건이 없기 때문에
언제나 1이다 이럴때는 컴파일러는 a의 값을 while조건시 참조할때
실제 a메모리를 참조하는 것이 아니라 메모리의 값을 미리 래지스터에
넣어놓고 while 조건 참조를 래지스터를 참조 한다. 일반적으로 cpu에
붙은 래지스터가 더 빠르다.

그러나 timer에서 수치로 쓰는 timer의 수치는 타이머 하드웨어 인터럽트로
잡기 때문에 언제 값이 변할찌 모른다.
따라서 위의 조건에서 while조건이 timer의 수치라면 조건이 언제나
같다고 볼수 없다. 그러나 불행하게도 컴파일러는 이것을 감지 못한다.
역시 최적화를 통해서 timer수치의 값을 래지스터에 넣어 버린다.
결국 timer수치가 인터럽트되어 갑자기 변해도 래지스터에 넣은 값으로만
조건을 판단하기에 원하는 결과가 나오지 않는다.
따라서 이런 경우 volatile을 써서 최적화를 하지 못하게 할수 있다.
최적화 되지 않은 timer 수치는 while 조건 검사시 언제나 최적화되지 않고
메모리상에서 실제 값을 참조하게 된다.

'KB > C/C++' 카테고리의 다른 글

변수와 함수의 선언 범위  (0) 2004.03.19
\f 와 \r의 차이점 double과 float의 차이점  (0) 2004.03.19
몇가지 코드 최적화  (0) 2004.03.19
C++과 객체 지향  (0) 2004.03.19
콤마에 대해서  (0) 2004.03.19

+ Recent posts