volatile pointer 질문.

지나가는새의 이미지

다음의 두 소스에서 차이점이 있나요? 전 있을거 같은데..

A.
volatile struct private *p = priv;
uint s = p->actus;

B.
struct private *p = priv;
volatile uint *s = &(p->actus);

전 A 방식에서는 s의 변화가 함수 내에서 변화 가능 하지 않지만 B방식은 그렇지 않은것 같습니다.

제가 제대로 보고 있는건지 아리까리 하네요.
조언 부탁 드려요~

doldori의 이미지

A의 경우 p->actus의 값을 s로 복사하는 것이므로 s의 변경이 p가 가리키는 대상에
미치는 영향은 없습니다. volatile의 의미는 프로그램에 알려지지 않은 방식으로
변경될 수 있으니 컴파일러가 코드를 있는 그대로 번역해야 하면 함부로 최적화 같은
것은 하지 말라는 것입니다. 예를 들어 p가 가리키는 대상이 volatile이므로

volatile struct private *p = priv;
p->actus = 0;
uint s = p->actus;

이런 코드를
volatile struct private *p = priv;
p->actus = 0;
uint s = 0;

이런 식으로 번역하지 말라는 뜻이죠.

마찬가지로 B의 경우도

struct private *p = priv;
volatile uint *s = &(p->actus);
*s = 0;
uint i = *s;

이것을
struct private *p = priv;
volatile uint *s = &(p->actus);
*s = 0;
uint i = 0;

이런 식으로 번역하지 말라는 뜻입니다.