얼마전에 C언어에서 간단히 for문으로 지연을 시도하는 코드를 다룬적이 있는데

제대로 딜레이가 안되어서 봤더니 변수가 volatile 선언없이 되어 있더군요.

예를 들어 아래와 같이 for문안에 뻔한 연산을 하는 코드가 있다고 하면

int result;

for(i=0; i < 100000; i++){

result = 100;

}

컴파일러는 최적화를 수행해서 아래와 같이 만들어 줍니다.

int result = 100;

for(i=0; i <10000;i++){}


result변수를 volatile로 선언할 경우는 맨 처음 의도한 대로 코드가 동작합니다.

volatile int result;


또 한가지 더 예를 들면.

int result = 1;
... 
while (result != 0);

여기에서도 result에 volatile 타입이 없기 때문에 컴파일러는 아래와 같이 최적화합니다.
int result = 1;
... 
while (true);
따라서 의도한 대로 result !=0으로 하기 위해서는 result 변수에 volatile 타입을 추가해 주어야합니다.

결론적으로 컴파일러가 변수를 마음대로 변경하지 못하도록 하고 싶을때에는

꼭 변수 앞에 volatile 키워드를 붙여야 합니다.