F.R.I.D.A.Y.

C: volatile 키워드 본문

DEV/C C++

C: volatile 키워드

F.R.I.D.A.Y. 2020. 8. 22. 23:56
반응형

https://pixabay.com/photos/chips-card-chip-computer-data-20072/

 오늘 시간에는 컴파일러 최적화에서 대상 변수를 제외하는 volatile 키워드를 알아보겠습니다.


volatile

네이버 사전

 휘발성의, 변덕스러운 등의 뜻을 가진 volatile은 사용되는 변수의 값 변경이 확실히 이루어져야할 때 사용합니다.

 

 우리가 컴파일을 진행할 때, 컴파일러는 만들어지는 프로그램의 속도 향상을 위해 코드 최적화를 시행합니다. 코드 최적화 과정에서는 우리가 의도적으로 만든 코드가 일부 변경되기도하는데요, 그 과정에서 값의 대입이 무시되는 경우가 있습니다.

 

 아래 코드를 보겠습니다.

#include <stdio.h>

int main(void){
   int var = 5;
   
   var = 3;
   var = 2;
   
   printf("var의 값: %d\n", var);
   
   return 0;
}

 이 코드에서는 int 타입의 변수 var에 처음에는 5를, 그 다음엔 3을, 마지막으론 2를 대입한 뒤에 var의 값을 출력하도록 하고 있습니다. 이 포스트를 보는 많은 분들께서는 변수에 값을 대입하면 기존에 저장되어있는 값은 사라진다는 것을 알고 있을것입니다. 따라서 5와 3을 대입하는 코드는 불필요한 코드이죠.

 

 따라서 컴파일러는 아래와 같이 최적화를 진행해버립니다.[# 물론 컴파일러 최적화 수준에 따라 달라질 수 있는 내용이니 참고용으로만 보기 바랍니다. 위 코드가 무조건 아래처럼 바뀐다는 말이 아닙니다.]

#include <stdio.h>

int main(void){
   int var;
   
   var = 2;
   
   printf("var의 값: %d\n", var);
   
   return 0;
}

 5와 3이 대입되는 코드가 사라졌습니다. 속도 측면에서는 더 이로운 작업이죠. 그러나 5와 3을 대입하는 코드가 프로그래머가 의도적으로 넣은 코드라면 이야기는 달라집니다. 필요에 의해 넣은 코드를 컴파일러가 최적화 한답시고 지워버린 것이니까요. 이럴 때 volatile 키워드를 사용하는 것입니다.

 

 var 변수를 선언할 때 머리부분에 volatile 키워드를 넣음으로써 해당 변수를 읽거나 쓰는 경우, 무조건 변수의 메모리를 참조하도록 합니다.

#include <stdio.h>

int main(void){
   volatile int var = 5;
   
   var = 3;
   var = 2;
   
   printf("var의 값: %d\n", var);
   
   return 0;
}

 이 코드는 최적화가 되더라도 volatile 키워드에 의해 5와 3을 대입하는 코드가 사라지지 않습니다.

 

 최적화 과정에서는 종종 속도를 위해 읽기와 쓰기 작업 순서가 변경되곤 합니다. 변경을 원치 않을 때, 혹은 변경이 되어선 안될때도 사용할 수 있습니다.


읽을거리.

 

Volatile : 멀티쓰레드 프로그래밍 시 거의 쓸모 없는 그 것

원본 : http://software.intel.com/en-us/blogs/2007/11/30/volatile-almost-useless-for-multi-threaded-p...

blog.naver.com

 

 

멀티 쓰레드 프로그램에서 공유 변수는 항상 volatile 로 해야 하나요? | KLDP

멀티 쓰레드 프로그램에서, int i; 를 a, b 쓰레드에서 공유할 때, i 를 volatile int i; 로 선언하지 않으면 쓰레드간에 서로 다른 값을 참조하는 경우가 생길수 있나요? CPU 캐시가 한 프로세스 내에서��

kldp.org

 

728x90
반응형

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

Visual Studio 2019에서 프로젝트 만들기  (0) 2020.09.07
C: 반복문  (0) 2020.09.07
C: 숫자 지그재그로 출력하기  (0) 2020.07.24
프로그램에 일상을 더하다: 여러 항목 정렬하기  (0) 2020.03.19
XOR: 배타적 논리합  (0) 2020.02.28
Comments