volatile은 휘발성이라는 뜻으로 C, C++, JAVA 등에서 변수를 volatile로 선언하면 그 변수는 액세스할 때마다 값이 달라질 수 있다는 것을 의미한다.
다음은 volatile로 선언되어 있지 않는 일반 변수 i를 사용한 C 코드이다.
<예#1> |
int i=0; for(;;) { if(i!=0) break; } |
위의 코드는 일반적인 상황에서 다음 코드와 동일한 동작을 하고 C 컴파일러에서 최적화 옵션에 따라 실제로 아래와 같이 변환하여 컴파일을 실행한다.
<예#2> |
int i; while(1); |
하지만, 만약 다른 인터럽트 루틴에서 i을 값을 변화 시킨다면, <예#1>을 <예#2>와 같이 변환 시키지 말아야 한다. 또는, 변수 i가 외부 포트의 값을 읽는 변수라면 또한 변화 시키지 말아야 한다. 즉, 이와 같은 상황에서는 for 루프에서 계속해서 i값을 읽어야 하지만, C 컴파일러는 그런 상황을 모르기 때문에 <예#1>와 같은 코드를 <예#2>로 변환 시켜 버린다.
이때, 이러한 C 컴파일러의 변환을 막아주는 선언이 volatile이다. volatile로 선언된 변수는 그 변수 값이 읽을 때마다 다른 값을 될 수 있기 때문에 C 컴파일러에서 최적화 하지 않고 코드 그대로 실행한다. volatile은 다음과 같이 사용한다.
<예#3> |
volatile int i=0; for(;;) { if(i!=0) break; } |
volatile로 변수를 선언하면 그 변수를 사용하는 부분은 최적화가 되지 않기 때문에 속도 감소와 코드 크기 증가가 발생할 수 있다.
인터럽트와 외부 포트를 많이 사용하는 임베디드 시스템 프로그램 작성 시에는 반드시 알아야 하는 매우 중요한 선언문이다. volatile 문제로 버그가 발생했을 때 디버깅이 매우 어렵다.
'컴퓨터 > C' 카테고리의 다른 글
C의 min, max 함수 (0) | 2019.10.17 |
---|---|
[C] 포인터의 이해 (0) | 2019.02.05 |
C++ 연산자 오버로드 (0) | 2018.08.13 |
C 언어 나누기 연산 (0) | 2018.06.26 |
C 언어 (0) | 2016.03.05 |
댓글