C + + 의 volatile 키워드

http://www.cnblogs.com/Chase/archive/2010/07/05/1771700.html
도입부
    아래 코드 에 무슨 문제 가 있 는 지 맞 춰 보 세 요.
?
1
2
3
4 void Delay( UINT32 n) {      while (—n); }
    답:
    원래 코드 는 완전히 정상 이지 만 성능 을 최적화 하기 위해 컴 파 일 러 의 최 적 화 를 열 었 다.그러나 이 함수 가 컴 파일 러 에 의 해 최적화 되 었 다 는 것 을 발견 했다.최적화 되 는 것 을 방지 하기 위해 서 함수 의 매개 변수 에 volatile 을 추가 해 야 합 니 다.
?
1
2
3
4 void Delay( volatile UINT32 n) {      while (—n); }
도입부
    이 코드 에 무슨 문제 가 있 는 지 다시 맞 춰 보 세 요.
?
1
2
3
4 int square( volatile int *ptr)       return *ptr * *ptr;  }
    답:
    * ptr 가 volatile 형 인 자 를 가리 키 기 때문에 컴 파일 러 는 다음 과 같은 코드 를 생 성 합 니 다.
?
1
2
3
4
5
6
7 int square( volatile int *ptr)        int a,b;       a = *ptr;       b = *ptr;       return a * b;  }
    * ptr 의 값 이 예상 치 못 하 게 변 할 수 있 기 때문에 a 와 b 는 다 를 수 있 습 니 다.결국, 이 코드 는 당신 이 원 하 는 제곱 값 이 아 닐 수도 있 습 니 다!정확 한 코드 는 다음 과 같 습 니 다.
?
1
2
3
4
5
6 int square( volatile int *ptr)        int a;       a = *ptr;       return a * a;  }
 
본문
    volatile 키 워드 는 형식 수정자 로 서 특정한 컴 파일 러 가 알 수 없 는 요소 에 의 해 변 경 될 수 있 음 을 나타 낸다. 예 를 들 어 운영 체제, 하드웨어 또는 다른 스 레 드 등 이다.레지스터 에 접근 하 는 속도 가 RAM 보다 빠 르 기 때문에 컴 파 일 러 는 일반적으로 액세스 외부 RAM 을 줄 이 는 최 적 화 를 한다.이 키워드 성명 의 변 수 를 만나면 컴 파일 러 는 이 변 수 를 방문 하 는 코드 를 최적화 하지 않 고 특수 주소 에 대한 안정 적 인 접근 을 제공 할 수 있 습 니 다.
    volatile 의 본 뜻 은 '변 하기 쉬 운' 이지 만 '원본 메모리 주 소 를 직접 액세스 하 는 것' 으로 번역 하 는 것 이 더욱 적합 하 다.'변 하기 쉬 운' 은 외적 요인 으로 인해 발생 하 는 것 이다. 예 를 들 어 다 중 스 레 드, 중단 등 은 volatile 로 수식 한 변수 가 '변 하기 쉬 운' 것 이 아니 라 외부 원인 이 없 으 면 volatile 정 의 를 사용 해도 변 하지 않 는 다.
    이 키 워드 를 사용 하 는 예 는 다음 과 같 습 니 다. 
?
1 int volatile nVint; // volatile  , , 。 。
    이러한 코드 에 대해:
?
1
2
3
4 volatile int i = 10;  int a = i; ... // , , i int b = i;
    volatile 은 i 는 수시로 변화 가 발생 할 수 있 으 며, 이 를 사용 할 때마다 i 의 주소 에서 읽 어야 하기 때문에 컴 파일 러 가 생 성 한 어 셈 블 리 코드 는 i 의 주소 에서 데 이 터 를 다시 읽 어 b 에 넣 습 니 다.최적화 방법 은 컴 파일 러 가 i 에서 데 이 터 를 읽 은 코드 간 의 코드 가 i 에 대해 조작 한 적 이 없 기 때문에 마지막 에 읽 은 데 이 터 를 b 에 자동 으로 넣 는 것 이다.i 에서 다시 읽 는 게 아니 라이렇게 되면 i 가 레지스터 변수 이거 나 포트 데 이 터 를 표시 하면 오류 가 발생 하기 쉬 우 므 로 volatile 은 특수 주소 에 대한 안정 적 인 접근 을 확보 할 수 있 습 니 다.
    일반적으로 volatile 은 다음 과 같은 몇 가지 곳 에 사용 합 니 다.
  • 서비스 프로그램 에서 수정 한 다른 프로그램 에서 검 측 할 수 있 는 변 수 를 중단 하려 면 volatile 을 추가 해 야 합 니 다.
  • 다 중 태 스 크 환경 에서 각 퀘 스 트 간 에 공유 하 는 표 지 는 volatile 을 추가 해 야 합 니 다.
  • 메모리 에 비 친 하드웨어 레지스터 는 보통 volatile 설명 을 추가 해 야 합 니 다. 읽 기와 쓰기 가 서로 다른 의 미 를 가 질 수 있 기 때 문 입 니 다.

  •     또한 상기 몇 가지 상황 은 데이터 의 완전 성 (서로 관련 된 몇 개의 표 지 를 반 쯤 읽 고 다시 쓰 는 것 이 중단 되 었 다) 을 동시에 고려 해 야 한다. 1 에서 인 터 럽 트 를 통 해 이 루어 질 수 있 고 2 중 작업 스케줄 을 금지 할 수 있 으 며 3 중 은 하드웨어 의 좋 은 디자인 에 의존 할 수 밖 에 없다.

    좋은 웹페이지 즐겨찾기