volatile 키워드
컴파일러의 최적화 옵션의 적용을 받지 않도록 하는 선언자.
비슷한 것으로 constant 선언이 있는데 서로 다른 점이라면 constant 선언의 경우에는 변수 정의 시점에 대입된 값이 어떠한 경우에도 변경되지 않도록 보호하는 형태 즉 상수의 형태로 보존되도록 하라는 옵션이다.
이와 달리 volatile의 경우에는 컴파일러가 프로그램의 코딩을 최적화를 통해 임의로 수정하지 못하도록 하는 명령어로 변수 선언시 임의로 레지스터에 변수를 올리지 않게 하고 메모리에 올리게 하며 코드는 임의로 수정을 하지 못하게 한다.
즉, 해당 변수의 데이터가 변할 수 있기 때문에 항상 해당 메모리에 접근해서 데이터를 직접 참조하라는 지시자이다.
간단한 예)
int i, a, b;
a = 0; b = 0;
for(i = 0; i < 10; i++)
b += a * 100;
이런 코드를 작성한 경우.. 일반적인 컴파일러로 최적화를 하게 되면
int i, a, b;
a = 0; b = 0;
for(i = 0; i < 10; i++)
b += 0; // 연산을 하지 않게 컴파일러가 알아서 보정해 버린다.
(최적화 옵션에 따라 다양하게 변할 수 있다.)
이처럼 컴파일러 차원에서 옵티마이저시 위와 비슷한 로직으로 자동 변환이 되게 되는데(정확히는 어셈블 과정에서 코드가 변환되어 비 효율적이라 판단되는 부분을 수정 또는 제거해 버린다.)
프로그램에 따라서는 이렇게 코드가 변경되면 안되는 경우가 있다.
즉 컴파일을 할 때 최적화 옵션으로 인해 변경될 경우를 방지하기 위한, 반드시 내가 명시한대로 실행할 필요가 있을 경우 사용하는 키워드이다.
또한 변수에 값을 대입 할 때 (메모리에 write) 항상 공유 메모리에 직접 쓰거나 읽지 않고 쓰기 버퍼(저장 버퍼)에 값을 임시로 저장했다가 실제 공유메모리에 write할 수 있다. 이럴 경우 멀티 스레드 환경에서 메모리를 읽었을 때 기대하는 값이 나오지 않을 수 있다.
register 키워드
해당 변수를 메모리에 저장하는 것이 아닌 실제로 연산이 일어나는 레지스터에 저장되게 한다.
레지스터는 고속 연산이 가능하므로 상당한 실행 시간을 보장 받을 수 있지만
용량의 한계가 있으므로 간단한 프로그램 위주로 많이 쓰인다.
출처 : http://blog.naver.com/sorkelf/40146367692
'Basic Programming > C, C++' 카테고리의 다른 글
C++ - 멤버 이니셜라이져(Member Initializer) (0) | 2016.03.03 |
---|---|
C++ - ZeroMemory와 memset의 차이 (0) | 2016.03.03 |
C++ - 타입 캐스팅(static_cast, reinterpret_cast, dynamic_cast, const_cast) (0) | 2016.03.03 |
C++ - auto_ptr의 문제점 (0) | 2016.02.26 |
C++ - Explict와 Mutable 키워드 (0) | 2016.02.24 |