본문 바로가기

IT/Basic

volatile 변수

volatile 변수

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

 

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

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

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

 

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

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

 

 

C 언어 코딩 도장: 85.15 volatile 변수

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

dojang.io

 


이렇게 되면 개발자가 의도한 대로, 그리고 눈에 보이는 대로 기계어 코드가 생성된다. 이 프로그램만으로는 무한루프라고 생각할 수 있지만, 만약 foo가 하드웨어 장치의 레지스터라면 하드웨어에 의해 값이 변할 수 있다. 따라서 하드웨어 값을 폴링(poll)할 때 사용할 수 있다.

 


 의미없는 반복문 같은 경우는 컴파일러에 따라서 캐쉬 메모리를 이용한다던가 레지스터 내에서 모든 연산을 마치고 값을 다시 메모리로 계산값을 메모리(즉, 변수)에 저장하는 최적화를 진행한다. volatile은 이러한 최적화를 금지하고 FM대로 메모리에 접근하고 레지스터로 이를 읽어와 연산 후 메모리로 다시 저장시키는 방식으로 처리하라는 선언이다.

 



 

volatile 변수의 쓰임

volatile 키워드는 한 마디로 얘기하면 컴파일러가 메모리 접근을 최소화 시키는 최적화를 하지 못하게 막는 예약어이다.  의미없는 반복문 같은 경우는 컴파일러에 따라서 캐쉬 메모리를 이용

zapiro.tistory.com

 

'IT > Basic' 카테고리의 다른 글

3rd party란  (0) 2021.02.04
Memory bound vs Compute bound  (0) 2021.01.22
Debug mode, Release mode, Assert  (0) 2021.01.07
크로스 컴파일(cross compile)  (0) 2021.01.07
라이브러리 .a 파일 .so 파일  (0) 2020.10.22