Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++에서 volatile 한정자를 사용하는 이유는 무엇일까?

volatile 한정자가 의미하는 두 가지

C++에서 volatile 한정자는 컴파일러에게 다음 두 가지 중요한 사실을 알려주는 역할을 합니다.

  • 변수 값이 작성된 코드와 무관하게 변경될 수 있다. 하드웨어, 인터럽트, 다른 스레드 등 프로그램 코드 외부의 요인에 의해 변수 값이 언제든 바뀔 수 있기 때문에, 컴파일러는 해당 변수를 읽을 때 이전에 읽었던 값이나 마지막으로 저장했던 값을 재사용해서는 안 되며, 반드시 매번 새로 읽어야 합니다.

  • volatile 변수에 값을 저장하는 행위는 외부에서 관찰 가능한 '부작용(side effect)'이다. 따라서 컴파일러는 값을 저장하는 동작을 임의로 삭제할 수 없습니다. 예를 들어 같은 변수에 연속으로 두 번 값을 저장하는 코드가 있다면, 컴파일러는 실제로 두 번 모두 저장해야 합니다.

예제 코드로 이해하기

i = 2;
i = i;

위 코드에서 컴파일러는 숫자 2를 변수 i에 저장하고, 변수 i를 다시 읽은 후, 읽어온 값을 i에 저장하는 일련의 동작을 생략 없이 그대로 수행해야 합니다.

만약 i가 일반 변수였다면 이러한 중복 연산은 당연히 최적화 과정에서 제거되겠지만, volatile이 선언된 변수에는 이런 최적화가 허용되지 않습니다. 이것이 바로 volatile이 존재하는 핵심 이유입니다.

volatile이 필요한 대표적인 상황

  • 메모리 매핑 I/O(MMIO)처럼 하드웨어 레지스터와 직접 연동되는 변수
  • 인터럽트 서비스 루틴(ISR)과 메인 코드가 공유하는 변수
  • setjmp/longjmp처럼 비정상적인 제어 흐름을 통해 접근되는 변수

volatile 키워드에 대한 더 자세한 내용은 GeeksforGeeks의 관련 문서(Understanding Volatile Qualifier in C/C++)를 참고하시기 바랍니다.