“volatile int * p”와 같은 point-to-volatile 포인터가 유용한 이유는 무엇입니까?
volatile컴파일러에게 참조를 최적화하지 않도록 지시하여 모든 읽기 / 쓰기가 레지스터에 저장된 값을 사용하지 않고 실제 메모리 액세스를 수행하도록하는 것입니다. 나는 그것이 일반적인 변수에 유용하다는 것을 이해할 수 있지만 volatile포인터에 어떤 영향을 미치는지 이해하지 못합니다 .
volatile int *p = some_addr;
int a = *p; // CPU always has to load the address, then does a memory access anyway, right?
다음과 같이 선언 된 경우 차이점은 무엇입니까 int *p = some_addr?
양식의 포인터
volatile int* p;
int컴파일러가로 처리 할에 대한 포인터 volatile입니다. 즉, 컴파일러는 p소스 코드에 이것이 발생할 수 있음을 암시하는 내용이 없더라도 가리키는 변수 가 변경 될 수 있다고 가정 합니다. 예를 들어 p일반 정수를 가리 키도록 설정 *p하면 컴파일러를 읽거나 쓸 때마다 값이 예기치 않게 변경되었을 수 있음을 인식합니다.
a에 대한 사용 사례가 하나 더 있습니다 volatile int*. intas 를 선언하면 volatile일반으로 가리키면 안됩니다 int*. 예를 들어, 이것은 나쁜 생각입니다.
volatile int myVolatileInt;
int* ptr = &myVolatileInt; // Bad idea!
그 이유는 C 컴파일러가 by ptr가 가리키는 변수가라는 사실을 더 이상 기억하지 않아 레지스터 volatile의 값을 *p잘못 캐시 할 수 있기 때문 입니다. 사실, C ++에서 위 코드는 오류입니다. 대신 다음과 같이 작성해야합니다.
volatile int myVolatileInt;
volatile int* ptr = &myVolatileInt; // Much better!
이제 컴파일러는이 ptr지점을 기억 volatile int하므로를 통해 액세스를 최적화하려고 시도하지 않습니다 (또는해서는 안됩니다!) *ptr.
마지막으로 논의한 포인터는 volatile int. 다음과 같이 할 수도 있습니다.
int* volatile ptr;
이 포인터 말한다 자체 입니다 volatile당신이 결합 할 수있는 포인터 자체가 (등 하드웨어) 다른 무언가에 의해 재 할당받을 수 있기 때문에 컴파일러는 메모리에 캐시에 포인터를 시도하거나 포인터 값을 최적화하려고하지해야한다는 것을 의미, 이 짐승을 얻으려면 함께 :
volatile int* volatile ptr;
이것은 포인터와 pointee 모두 예기치 않게 변경 될 수 있음을 나타냅니다. 컴파일러는 포인터 자체를 최적화 할 수 없으며 가리키는 대상을 최적화 할 수 없습니다.
도움이 되었기를 바랍니다!
이 코드 volatile int *p = some_addr는 volatile int. 포인터 자체는 아닙니다 volatile.
int뿐만 아니라 휘발성 포인터가 필요한 경우에는 다음을 사용해야합니다.
volatile int * volatile p;
나는 당신이 그것을 사용해야 할 상황을 생각할 수 없습니다.
휘발성의 유용성 : 직렬 인터페이스 컨트롤러와 같은 하드웨어에 의해 수정되는 메모리를 확인해야하는 경우 필요합니다. 임베디드 시스템의 세계에서 응용 프로그램이 있으며, 중간에 OS없이 하드웨어에 매우 가깝게 작업 할 수 있습니다.
'program story' 카테고리의 다른 글
| Atom에서 Python 실행 (0) | 2020.11.02 |
|---|---|
| Eclipse 3.7 (Indigo) + Tomcat7 — 선택한 유형을 사용하여 서버를 만들 수 없습니다. (0) | 2020.11.01 |
| Eclipse에서 마지막 커서 위치로 이동하는 방법은 무엇입니까? (0) | 2020.11.01 |
| CSS 및 jQuery를 사용하는 Instagram의 iPhone 앱에서와 같이 "푸시 업"하는 고정 헤더 가져 오기 (0) | 2020.11.01 |
| int.TryParse가 실제로 작동하는 방식 (0) | 2020.11.01 |