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

+ Recent posts