Coding Memo

volatile 변수 본문

Language/C++

volatile 변수

minttea25 2022. 8. 19. 14:51

본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 정리한 글입니다.


변수를 선언 할 때, 타입 앞에 volatile을 붙여서 선언할 수 있다.

 

volatile 변수는 C/C++ 만 아니라 Java 등의 다른언어에도 있는 개념이다.

volatile 키워드가 붙은 변수는 컴파일러가 코드를 최적화 하는 과정에서 해당 변수에 대한 최적화를 하지 않도록 한다.

 

즉, 컴파일 과정에서 최적화에서 제외되어 프로그램 실행 시에 매번 값을 확인하러 메모리에 접근하도록 한다.


아래 코드를 실행 시킨다고 하자.

int main()
{
	int a = 0;
	a = 1;
	a = 2;
	a = 3;
	cout << a << endl;

	return 0;
}

당연하지만, 위 실행 과정을 간단히 살펴 보자면

1. int 타입의 변수 a를 선언하고 0 값으로 초기화

2. a 를 1 로 업데이트

3. a 를 2 로 업데이트

4. a 를 3 으로 업데이트

5. a 출력

 

결과로 3이 출력되지만 이를 Release 모드로 실행시켜 컴파일 된 어셈블리어로 봐본다면 다르다.

(Debug 모드에서는 코드 최적화를 하지 않지만, Release 모드에서는 최적화를 실행한다.)

차이를 잘 설명한 다른 분의 글이 있으니 링크!

2~4 번 코드에 대한 어셈블리어 자체가 생성이 되지 않음

int a = 0; 부터 a = 1, a = 2, a = 3 코드에 대한 어셈블리어가 아예 컴파일이 되지 않아 어셈블리어가 생성이 되지 않을 것을 확인 할 수 있다.

 

왜 다르게 나온 것일까?

 

생각해보면 간단하다. 변수 a를 사용하기 전에 (cout << a << endl; 전에) 값을 아무리 변경해도 상관이 없기 때문이다. 결국 사용되는 a 값은 3이니까 마지막으로 업데이트 된 값만 기억하면 된다. 컴파일러는 이런 과정을 최적화 한다.

 

그렇다면 volatile 키워드를 붙인 a에 대해 아래와 같은 코드를 실행 해보자. (마찬가지로 Release 모드)

int main()
{
	volatile int a = 0;
	a = 1;
	a = 2;
	a = 3;
	cout << a << endl;

	return 0;
}

 

이번에는 volatile int a = 0 부터 a = 3 까지의 모든 코드에 대한 어셈블리어가 생성되고 실행된 것을 확인 할 수 있다.

 

물론, 최적화가 안되어 있다는 것은 매번 값에 접근해야되는 상황이 발생하니 연산량이 더 많아지게 되는 것은 사실이다.

모든 코드에 대한 어셈블리어가 생성 되었다.


한가지 경우를 더 살펴 보자.

마찬가지로 a++ 연산을 수행하지 않고 'mov edx, 3'으로 바로 a 값에 3을 넣어주는 어셈블리 코드가 생성이 된다. 즉, while 문이 사라져 버린 셈이 됬다.

 

volatile 키워드를 사용하니 while 문이 제대로 하나하나 실행 되는 것을 볼 수 있다.

(eax로 a를 가져와서 inc로 ++을 한뒤에 다시 eax에서 a로 값을 옮긴 후,  jl 명령으로 jmp 하는 것을 볼 수 있다.)


어셈블리어는 MIPS로 밖에 공부해보지 않아서 기본 명령어는 이해하더라도, 위에 나타나있는 명령어 하나하나 이해가 바로 안되서 좀 찾아보면서 작성하였다. 


참고 글

https://dojang.io/mod/page/view.php?id=749 

 

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

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

dojang.io


다음 글 (volatile 변수와 쓰레드 실험)

https://minttea25.tistory.com/71

 

volatile 전역변수 사용 - 쓰레드

이전 글: https://minttea25.tistory.com/68 volatile 변수 본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 정리한 글입니다. 변수를 선언 할 때, 타입 앞에 volatile을 붙여서 선언할 수.

minttea25.tistory.com