volatile 이란 "휘발성이 있는, 날라가는 성질이 있는" 이라는 뜻의 영단어입니다.
변수 선언 시에 volatile 을 붙이게 되면, 이 변수의 내용은 언제든지 변할 수 있기 때문에, 최적화하지 말아달라는 의미입니다.
예를 들어서, 아래와 같은 코드를 작성했다고 하면
int main(void) {
int a = 1;
while(a > 0) {
printf("%d\n", a);
}
return 0;
}
컴파일러는 이 코드를 컴파일하면서, while(a > 0) 은 항상 참이 되기 때문에 아래와 같이 바꿔버립니다.
int main(void) {
int a = 1;
while(1) { // 항상 참
printf("%d\n", a);
}
return 0;
}
비교 연산을 하나라도 줄이면 실행 파일의 크기는 물론 실행 시간도 줄일 수 있기 때문이죠.
그런데 a 변수가 조금 특별해서, 코드에서는 바꾸지 않았지만 외적 요인에 의해(다른 프로그램이 바꾸는 등) 값이 변할 수 있어서 항상 a과 0을 비교할 필요가 있을 때는, volatile 연산자를 붙여주어서 '코드에는 없지만 외부에서 이 변수의 값을 바꿀 가능성이 있다'라는 것을 컴파일러에 알려줍니다. 그러면 컴파일러는 위와 같이 함부로 최적화하지 않습니다. 즉,
int main(void) {
volatile int a = 1;
while(a > 0) {
printf("%d\n", a);
}
return 0;
}
같이 프로그램을 작성하면, while의 조건식은 절대 컴파일러가 바꾸지 않으므로 무조건 a > 0 이 되고,
무한 루프를 돌 때마다 a 값을 계속 비교한다는 의미입니다.
일반적으로 volatile 을 쓸 일은 없지만, 멀티 스레드 프로그래밍이라는 것을 할 때에는 필요한 부분입니다.
출처 :
kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=150820310
'Programming Language > C Language' 카테고리의 다른 글
C언어) getgid() 함수 (0) | 2021.06.16 |
---|---|
C언어) 파일 디스크립터(FD, File Descriptor) (0) | 2021.06.15 |
C언어) read() 함수 (0) | 2021.06.15 |
C언어) open() 함수 (0) | 2021.06.15 |
C언어) strstr() 함수 (0) | 2021.06.15 |