Programming/C C++
C언어의 소스코드(Source Code)는 전처리라는 과정을 통해 소스코드를 변경하는 과정을 거쳐 코드(Code)자체를 최적하하게 됩니다.

하지만 이 최적화 라는 것이 잘못되면 Program에 엉뚱한 수행결과를 가져다 줄 수 있습니다. 때문에 어떤 경우는 최적화를 피하도록 지정해 줘야 합니다.

예를 들어

#include <stdio.h>

main()
{
  int a = 0;
 
  while(a == 0)
    printf("a의 값은 %d\n", a);
}


이 Program은 무한대로 loop가 돌면서 화면에 Message를 출력할 것입니다. 다소 쌩뚱맞은 Program이긴 하지만 간혹 이러한 Program을 어쩔 수 없이 작성해야 하는 경우가 있습니다.

예를 들어 다른 외부의 특정장치(일례로 센서같은 것이 있습니다.)에서 a값을 주기적으로 변화시키는 경우 While문을 통해 그 값을 확인하면서 특정 값이 될때 loop가 중단되도록 할 필요가 있는 것입니다. 문제는 최적화 과정을 통해 위 Source Code를 다음과 같이 바꿔버리는 경우입니다.

#include <stdio.h>

main()
{
  int a = 0;
 
  while(0 == 0)
    printf("a의 값은 %d\n", a);
}


While의 (a == 0)조건이 (0 == 0)으로 바뀌었습니다. 결국 이 program은 정말 멈추지 않는 무한 loop를 가진 Program이 되었습니다. 외부에서 a값을 수정한다고 해도 조건 자체가 (0 == 0)이므로 원하는 동작을 얻을 수 없는 것입니다.

즉, 최적화라는 것이 오히려 Program의 이상동작을 유발시키고 있는 것인데 이런경우 volatile를 사용하여 이 문제를 피해야 합니다.

#include <stdio.h>

main()
{
  volatile int a = 0;
 
  while(a == 0)
    printf("a의 값은 %d\n", a);
}


이렇게 변수를 선언할때 volatile를 추가하면 변수 a는 최적화 대상에서 제외되기 때문에 while문에서 (a == 0)을 (0 == 0)으로 바꿔버리는 현상을 막을 수 있습니다.

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

[C, C++] 제어문  (0) 2011.02.01
[C, C++] 공용체  (0) 2010.09.27
[C, C++] Volatile  (0) 2010.09.15
[C, C++] File 다루기  (0) 2010.08.13
[C, C++] Program에 인수 전달하기  (0) 2010.08.11
[C, C++] malloc함수와 구조체를 통한 연결 List(리스트) 구현  (0) 2010.08.06
0 0