구조체를 휘발성으로 만들면 모든 멤버가 휘발성이됩니까?


96

만약 내가 가지고 있다면:

struct whatever {
int data;
};
volatile whatever test;
test.data역시 변동성이?


4
훌륭한 질문입니다. 나는 갖는 읽을 volatile멤버 함수 것은 단지하게 this회원 메모리에 접근 할 때마다 읽을 수는 있지만 "공식적으로"휘발성이없는 것, 그래서 포인터가 휘발성.
Alexandre C.

2
중복 가능성 있지만 여전히 좋은 질문입니다.
Sergei Tachenov 2010

답변:


119

다른 질문을 할 수 있습니다 (또는 단순히 원래 질문을 보는 다른 방법).

구조체를 const만들면 모든 멤버가 생성 const됩니까?

만약 내가 가지고 있다면:

struct whatever { int data; };

const whatever test;

test.data도 const마찬가지입니까?

내 대답은 : 네. 당신이 형식의 개체를 선언하는 경우 whateverconst모든 회원이 될 것이다 const너무

당신이 형식의 개체를 선언하는 경우 마찬가지로, whatever함께 volatile모든 회원이 될 것입니다 volatile당신이 가진 개체를 선언하는 경우처럼, 너무 const, 모든 그것의 회원이 될 것이다 const너무.

constvolatile동전의 양면이다; 표준에서 종종 cv-qualifiers.


표준에서 인용 ($ 7.1.5.1 / 8)

[참고 : volatile은 객체 의 값이 구현에서 감지 할 수없는 수단으로 변경 될 수 있기 때문에 객체와 관련된 공격적인 최적화를 피하기 위한 구현대한 힌트 입니다. 자세한 의미는 1.9를 참조하십시오. 일반적으로 volatile의 의미는 C에서와 같이 C + +에서 동일합니다.]

개체가 구조체의 인스턴스 인 경우 그 수단은 다음 컴파일러는 할 수없는 객체를 포함하는 공격적인 최적화를 피하기 , 하지 않는 한 그것의 각 구성원의 적극적인 최적화를 방지 할 수 있습니다. (그렇지 않으면 객체와 관련된 최적화를 어떻게 피할 수 있습니까?)


관련 주제 :

왜 C ++에서 volatile 키워드를 사용합니까?


constness는 즉시 memembers에게만 전파된다는 점에 유의하는 것이 중요합니다. 구조체가 어떤 객체에 대한 포인터를 보유하고 있다면 포인터 자체는 const (예 : 재 할당 할 수 없음)가되지만 가리키는 객체를 변경할 수 있습니다. (가정하여 구조체 CONST에 대한 포인터를 hoding되지 않음)
파블로 아리아

-2

출처 : http://msdn.microsoft.com/en-us/library/145yc477%28v=vs.80%29.aspx

포인터가 가리키는 객체를 const 또는 volatile로 선언하려면 다음 형식의 선언을 사용하십시오.

const char *cpch;
volatile char *vpch;

포인터의 값, 즉 포인터에 저장된 실제 주소를 const 또는 volatile로 선언하려면 다음 형식의 선언을 사용하십시오.

char * const pchc;
char * volatile pchv;

3
질문에 아니 대답
야콥 반 베들레헴
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.