program story

“volatile int * p”와 같은 point-to-volatile 포인터가 유용한 이유는 무엇입니까?

inputbox 2020. 11. 1. 17:44
반응형

“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_addrvolatile int. 포인터 자체는 아닙니다 volatile.

int뿐만 아니라 휘발성 포인터가 필요한 경우에는 다음을 사용해야합니다.

volatile int * volatile p;

나는 당신이 그것을 사용해야 할 상황을 생각할 수 없습니다.


휘발성의 유용성 : 직렬 인터페이스 컨트롤러와 같은 하드웨어에 의해 수정되는 메모리를 확인해야하는 경우 필요합니다. 임베디드 시스템의 세계에서 응용 프로그램이 있으며, 중간에 OS없이 하드웨어에 매우 가깝게 작업 할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/9935190/why-is-a-point-to-volatile-pointer-like-volatile-int-p-useful

반응형