Czy uczynienie struktury zmienną powoduje, że wszyscy jej członkowie są niestabilni?

96

Jeżeli mam:

struct whatever {
int data;
};
volatile whatever test;
będzie test.dataniestabilny?

znak
źródło
4
Świetne pytanie. Czytałem, że posiadanie volatilefunkcji składowej sprawia, że thiswskaźnik jest nietrwały, więc elementy członkowskie będą odczytywane z pamięci za każdym razem, gdy będą uzyskiwane, ale nie są „oficjalnie” ulotne.
Alexandre C.
2
Prawdopodobnie duplikat , ale nadal dobre pytanie.
Siergiej Tachenov

Odpowiedzi:

119

Można zadać inne pytanie (lub po prostu spojrzeć na pierwotne pytanie w inny sposób):

Czy stworzenie struktury consttworzy wszystkich jej członków const?

Jeżeli mam:

struct whatever { int data; };

const whatever test;

Czy test.data constteż będzie ?

Moja odpowiedź brzmi: tak. Jeśli zadeklarować obiekt typu whateverz constczym wszyscy jej członkowie będą constzbyt

Podobnie, jeśli zadeklarujesz obiekt typu whateverz, volatilewówczas wszystkie jego elementy będą volatilerównież, tak jak w przypadku zadeklarowania obiektu z const, wszystko, co jest składnikiem , też będzie const.

consti volatilesą dwiema twarzami tej samej monety; są tak, że standard często określa je jako cv-qualifiers.


Cytowanie ze standardu (7,1,5,1 / 8 USD)

[Uwaga: zmienna jest wskazówką do implementacji, aby uniknąć agresywnej optymalizacji obejmującej obiekt, ponieważ wartość obiektu może zostać zmieniona w sposób niewykrywalny przez implementację. Zobacz 1.9 dla szczegółowej semantyki. Ogólnie rzecz biorąc, semantyka zmiennej lotnej ma być taka sama w C ++, jak w C.]

Oznacza to, że jeśli Twój obiekt jest instancją struktury, to kompilator nie może uniknąć agresywnej optymalizacji obejmującej obiekt , chyba że unika agresywnej optymalizacji każdego z jego elementów członkowskich. (W przeciwnym razie, jak inaczej można uniknąć optymalizacji obejmującej obiekt?)


Temat pokrewny:

Dlaczego używamy słowa kluczowego volatile w C ++?

Nawaz
źródło
Należy zauważyć, że stałość jest propagowana tylko do bezpośrednich członków. Jeśli twoja struktura posiada wskaźnik do jakiegoś obiektu, sam wskaźnik będzie stały (np. Nie będziesz mógł go ponownie przypisać), ale będziesz mógł zmienić wskazywany obiekt. (zakładając, że twoja struktura nie zawiera wskaźnika do const)
Pablo Arias
-2

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

Aby zadeklarować obiekt wskazywany przez wskaźnik jako stały lub nietrwały, użyj deklaracji postaci:

const char *cpch;
volatile char *vpch;

Aby zadeklarować wartość wskaźnika - czyli rzeczywisty adres przechowywany we wskaźniku - jako stałą lub nietrwałą, użyj deklaracji postaci:

char * const pchc;
char * volatile pchv;
Praktycznie prawdziwe
źródło
3
Brak odpowiedzi na pytanie
Jakob van Bethlehem