85.15 volatile 변수

변수를 선언할 때 앞에 volatile을 붙이면 컴파일러는 해당 변수를 최적화에서 제외하여 항상 메모리에 접근하도록 만듭니다.

  • volatile 자료형 변수이름;
volatile int num1 = 10;    // 변수를 최적화에서 제외하여 항상 메모리에 접근하도록 만듦

volatile로 선언한 변수는 사용할 때 항상 메모리에 접근합니다. 즉, 이 변수는 언제든지 값이 바뀔 수 있으니까 항상 메모리에 접근하라고 컴파일러에게 알려주는 것입니다.

예를 들어 다음과 같은 반복문이 있습니다.

int i = 0;

while (i < 10)
    i++;

printf("%d\n", i);    // 10

컴파일러는 이 코드를 최적화하여 while 반복문을 없애버리고 i에 그냥 10을 할당해버립니다(Visual Studio의 /O2 옵션, GCC의 -O3 옵션).

int i = 10;    // 반복문을 없애버리고 10을 할당

printf("%d\n", i);    // 10

대략 이런 모습이 됩니다(어셈블리까지 설명하지 않고 C 코드로 대신 설명했습니다).

여기서 ivolatile로 선언하면 반복할 때마다 항상 i의 메모리에 접근해야 하므로 컴파일러는 while 반복문을 없애지 않습니다.

volatile int i = 0;    // volatile로 선언하여 항상 메모리에 접근하도록 만듦

// 항상 i의 메모리에 접근해야 하므로 컴파일러는 반복문을 없애지 않음
while (i < 10)
    i++;

printf("%d\n", i);    // 10