반응형

[C++] volatile

반응형

volatile은 외부적인 요인으로 그 값이 언제든지 바뀔 수 있음을 명시하는 선언문에 쓰이는 키워드입니다. 따라서 컴파일러는 volatile 선언된 변수에 대해서는 최적화를 수행하지 않습니다.


volatile 변수를 참조할 경우 레지스터에 로드된 값을 사용하지 않고 매번 메모리르 참조하죠. 다음을 보시면 감이 잡히실 겁니다.


*(unsigned int *)0x8C0F = 0x8001

*(unsigned int *)0x8C0F = 0x8002;

*(unsigned int *)0x8C0F = 0x8003;

*(unsigned int *)0x8C0F = 0x8004;

*(unsigned int *)0x8C0F = 0x8005;

위의 코드를 보면 0x8C0F라는 똑같은 메모리 주소에 여러 값이 쓰여지는 것을 볼 수 가 있습니다. 만일 똑똑한 컴파일러라면 이 과정을 마지막 0x8005에 해당하는 값을 쓰는 것으로 최적화를 시키겠죠.


그러나 저것이 만일 Memmory-mapped I/O처럼 메모리 주소에 연결된 하드웨어 레지스터에 값을 쓰는 프로그램이라면 큰 문제가 발생합니다. 각각의 쓰기가 하드웨어에 특정 명령을 전달하는 것이라면 위의 4가지 명령어를 생략하고 마지막 명령어만 쓰는 꼴이 되는 셈이죠.


이럴 경우 volatile을 통해 컴파일러가 해당 변수를 최적화 대상에서 제외시킴으로서 간단하게 문제가 해결됩니다.


참고자료: http://skyul.tistory.com/337

반응형

'Language & Solution > C++' 카테고리의 다른 글

[C++] Header File (헤더 파일)  (0) 2018.06.24
[C++] 스마트포인터  (0) 2017.05.14
[C++] 얕은 복사, 깊은 복사  (0) 2017.05.14
[C++] virtual function 동작 방식  (0) 2017.05.13
[C++] lambda 식  (0) 2017.04.18

이 글을 공유하기

댓글

Designed by JB FACTORY