C 의 volatile 사용 방법
컴 파일 최적화,volatile 키워드 의 변수 와 관련 된 연산 을 진행 하여 컴 파일 최적화 하지 않 습 니 다.)
예 를 들 면:
volatile int i=10;
int j = i;
...
int k = i;
volatile 은 컴 파일 러 i 에 게 수시로 변화 가 발생 할 수 있다 고 알려 주 었 다.이 를 사용 할 때마다 i 의 주소 에서 읽 어야 하기 때문에 컴 파일 러 가 생 성 한 실행 가능 코드 는 i 의 주소 에서 데 이 터 를 읽 어 k 에 두 었 다.최적화 방법 은 컴 파일 러 때문이다.i 에서 데 이 터 를 읽 은 코드 사이 의 코드 가 i 를 조작 하지 않 은 것 을 발견 하면 마지막 으로 읽 은 데 이 터 를 k 에 자동 으로 넣 습 니 다.i 에서 다시 읽 는 게 아니 라이렇게 되면 i 가 레지스터 변수 이거 나 포트 데 이 터 를 표시 하면
오류 가 발생 하기 쉬 우 므 로 volatile 은 특수 주소 에 대한 안정 적 인 접근 을 보장 할 수 있 고 오류 가 발생 하지 않 습 니 다.
/**********************
volatile 로 정 의 된 변 수 는 이 변수 가 예상 치 못 하 게 변 할 수 있다 는 것 이다.그러면 컴 파일 러 는 이 변수의 값 을 가정 하지 않 을 것 이다.정확히 말 하면 최적화 기 는 이 변 수 를 사용 할 때 매번 조심스럽게 다시 읽 어야 한 다 는 것 이다.
이 변수의 값 은 레지스터 에 저 장 된 백업 을 사용 하 는 것 이 아 닙 니 다.다음은 volatile 변수의 몇 가지 예 입 니 다.
1)병렬 장치 의 하드웨어 레지스터(예:상태 레지스터)
2)인 터 럽 트 서비스 서브루틴 에서 접근 할 수 있 는 비 자동 변수(Non-automatic variables)
3)다 중 스 레 드 애플 리 케 이 션 에서 몇 가지 작업 에 공 유 된 변 수 는 이 질문 에 대답 하지 못 하 는 사람 은 고용 되 지 않 는 다.
나 는 이것 이 C 프로그래머 와 내장 시스템 프로그래머 를 구분 하 는 가장 기본 적 인 문제 라 고 생각한다.끼 워 넣 는 녀석 들 은 하드웨어,중단,RTOS 등 과 자주 접촉 하 는데,이 모든 것들 은 volatile 변 수 를 사용 해 야 한다.volatile 의 내용 을 몰라요.
재앙 을 가 져 올 것 이다.만약 에 면접 자가 이것 이 문제 라 고 정확하게 대답 했다 고 가정 하면(응,그 럴 수 있 을 지 의 심 스 러 워)나 는 이 녀석 이 volatile 의 완전한 중요성 을 똑바로 알 고 있 는 지 좀 더 깊이 연구 해 볼 것 이다.
1)하나의 매개 변 수 는 const 일 수도 있 고 volatile 일 수도 있 습 니까?왜?
2); 바늘 하나 가 volatile 일 수 있 나 요?왜?
3); 다음 함수 에 무슨 오류 가 있 습 니까?
int square(volatile int *ptr)
{
return *ptr * *ptr;
}
다음은 답 이다.1)네.하나의 예 는 읽 기 전용 상태 레지스터 입 니 다.그것 은 volatile 이다.왜냐하면 그것 은 예상 치 못 하 게 변 할 수 있 기 때문이다.프로그램 이 수정 을 시도 해 서 는 안 되 기 때문에 const 입 니 다.
2); 예.흔 치 않 지만.하나의 예 는 서비스 서브루틴 이 buffer 를 가리 키 는 지침 을 고 칠 때 입 니 다.
3)이 코드 는 좀 변태 적 이다.이 코드 의 목적 은 포인터*ptr 지향 값 의 제곱 을 되 돌려 주 는 것 입 니 다.그러나*ptr 가 volatile 형 인 자 를 가리 키 기 때문에 컴 파일 러 는 다음 과 같은 코드 를 만 들 것 입 니 다.
int square(volatile int *ptr)
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}
*ptr 의 값 이 예상 치 못 하 게 변 할 수 있 기 때문에 a 와 b 는 다 를 수 있 습 니 다.결국,이 코드 는 당신 이 원 하 는 제곱 값 이 아 닐 수도 있 습 니 다!정확 한 코드 는 다음 과 같다.
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}
비트 조작(Bit manipulation)//*********************
삽입 식 프로 그래 밍 에서 volatile 이라는 키 워드 를 자주 사용 하 는데 인터넷 에서 그의 용법 을 찾 아 보면 다음 과 같은 두 가지 로 요약 할 수 있다.
1.copiler 에 게 어떠한 최적화 도 할 수 없다 고 알려 줍 니 다.
예 를 들 어 특정한 주소 로 두 가지 명령 을 보 내야 한다.
int *ip =...; //
*ip = 1; //
*ip = 2; //
이상 의 프로그램 컴 파 일 러 는 최적화 할 수 있 습 니 다. int *ip = ...;
*ip = 2;
결국 첫 번 째 지령 을 잃 어 버 렸 다.
volatile 을 사용 하면 copiler 는 어떠한 최적화 도 허용 하지 않 고 프로그램의 원래 뜻 을 보증 합 니 다.
volatile int *ip = ...;
*ip = 1; *ip = 2;
컴 파 일 러 를 최적화 시 키 더 라 도 두 번 의 지불 문 구 를 하나 로 만 들 지 는 않 을 것 이다.그것 은 다른 최적화 만 할 수 있다.이것 은 device driver 프로그래머 에 게 매우 유용 하 다.
2:volatile 로 정 의 된 변 수 는 프로그램 밖에서 변 경 됩 니 다.매번 메모리 에서 읽 어야 합 니 다.그 를 cache 나 레지스터 에 두 고 중복 사용 할 수 없습니다.
...와 같다
volatile char a;
a=0;
while(!a)
{ //do some things; }
doother();
volatile 이 없 으 면 doother()는 실행 되 지 않 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java에서 volatile 키워드의 역할 및 사용법 상세 설명volatile 키워드의 역할은 시스템의 모든 라인이 이 키워드 수식에 대한 변수를 공유하고 볼 수 있도록 하는 것이다. 공유 변수가volatile로 수식될 때, 수정된 값이 메모리에 즉시 업데이트되고, 다른 라인이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.