C 언어의 'volatile' 키워드
C 언어의 휘발성에 대한 튜토리얼을 읽었지만 여전히 이해할 수 없습니다.일부에서는 휘발성이 컴파일러 최적화자에게 이 변수와 관련된 연산이 특정한 방법으로 최적화되어서는 안 된다고 말합니다.즉, 레지스터에서 변수 값이 변경될 때마다 해당 값이 메모리에 영향을 미쳐야 합니다.
또한 일부에서는 휘발성은 값이 이 코드 밖의 방법으로 변경될 수 있음을 의미한다고 말합니다.
저는 두 번째 말을 이해할 수 없습니다.그럼 휘발성 변수는 이 코드 이외의 방법으로 변경될 수 있는 겁니까? 어떻게요?그리고 이 두 진술이 모두 맞습니까?
"이 코드 밖의 방법으로 값을 변경할 수 있습니다"라는 문장은 기본적으로 다른 프로그램이나 하드웨어가 해당 변수를 업데이트할 수 있음을 의미합니다.이것은 완전히 가능합니다.이 개념을 여러 프로그램 간에 공유되는 파일과 연관시키는 것이 이 개념의 한 방법입니다.파일을 열고, 쓰고, 많은 프로그램에서 동시에 읽을 수 있습니다.파일을 읽을 때 가장 오래된 업데이트가 아닌 최신 업데이트를 읽고 있는지 확인합니다.
volatile 키워드로 돌아가서 변수 앞에 volatile을 배치하는 것도 마찬가지입니다.이것은 당신이 변수에서 읽고 있는 것이 컴파일러의 최적화나 당신의 프로그램이 가지고 있던 변수의 오래된 복사본에 기초하지 않는다는 것을 확실하게 합니다.또한 volatile 키워드를 사용하면 모든 액세스의 메모리에서 변수를 가져올 수 있습니다.따라서 volatile 키워드에 대해서는 두 가지 설명이 모두 맞습니다.
C는 반드시 컴퓨터를 위한 것은 아닙니다.예를 들어 게임보이 어드밴스용으로 개발하는 경우 하드웨어에 의해 수정되는 메모리 위치가 자주 나타나므로 코드의 변수를 수정하지 않을 수도 있지만 어쨌든 수정됩니다.그 점이랴.volatile
수단.
를 추가하여volatile
키워드는 컴파일러에게 "내 코드가 아무것도 하지 않으면 이 변수(메모리 위치)에 저장된 값이 바뀔 수 있습니다."라고 말하는 것입니다.
다음 중 하나를 고려합니다.
- 다중 threaded 애플리케이션,
- 공유 메모리를 사용하는 어플리케이션,
- I/O 등록을 주소 공간에 매핑하는 플랫폼에서 실행되는 응용 프로그램,
- 하드웨어 DMA가 백그라운드에서 발생하는 애플리케이션
이러한 각 상황에서 메모리는 현재 스레드 외부에서 변경될 수 있습니다.
"레지스터에서 변수의 값이 변경될 때마다 그 값이 메모리에 영향을 미쳐야 한다"는 것은 정확하지만 명확하지는 않습니다.
메모리 위치는 프로그램 코드 외부에서 수많은 방법으로 변경될 수 있습니다.예를 들어, 디스크에서 읽은 DMA가 버퍼에 쓰이거나 메모리 매핑된 장치가 장치의 일부 이벤트로 인해 위치를 변경할 수 있습니다.
여기서는 다중 스레드 응용 프로그램을 예로 들어 다음과 같이 설명합니다.변수의 값은 여러 스레드에 의해 변경될 수 있으므로 각 액세스의 메모리와 "동기화"되어야 합니다(값을 읽든 쓰든 상관없이).
휘발성 변수를 선언하면 컴파일러가 해당 변수 주변의 코드 스니펫을 최적화하지 않도록 지시하는 것입니다.이는 CPU가 로컬 레지스터나 캐시 메모리에서 변수 값을 사용하지 않고 매번 메인 메모리에서 값을 가져오도록 강제하기 위함입니다.
언급URL : https://stackoverflow.com/questions/5822386/the-volatile-keyword-in-the-c-language
'programing' 카테고리의 다른 글
jquery를 사용하여 모든 이벤트의 바인딩을 해제하는 방법 (0) | 2023.10.09 |
---|---|
WHERE SELECT 하위 쿼리 오류로 MYSQL 업데이트 (0) | 2023.10.04 |
(1) vs (True) -- (python 2 바이트 코드에서) 왜 차이가 나죠? (0) | 2023.10.04 |
리캡차 스타일링이 깨졌습니다. (0) | 2023.10.04 |
웹 응용 프로그램 []이(가) [Abandoned connection cleanup thread] com.mysql.jdbc라는 이름의 스레드를 시작한 것으로 보입니다.버려진 연결 정리실 (0) | 2023.10.04 |