Ś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?)
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)
volatile
funkcji składowej sprawia, żethis
wskaź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.Odpowiedzi:
Można zadać inne pytanie (lub po prostu spojrzeć na pierwotne pytanie w inny sposób):
Czy stworzenie struktury
const
tworzy wszystkich jej członkówconst
?Jeżeli mam:
Czy test.data
const
też będzie ?Moja odpowiedź brzmi: tak. Jeśli zadeklarować obiekt typu
whatever
zconst
czym wszyscy jej członkowie będąconst
zbytPodobnie, jeśli zadeklarujesz obiekt typu
whatever
z,volatile
wówczas wszystkie jego elementy będąvolatile
również, tak jak w przypadku zadeklarowania obiektu zconst
, wszystko, co jest składnikiem , też będzieconst
.const
ivolatile
są dwiema twarzami tej samej monety; są tak, że standard często określa je jakocv-qualifiers
.Cytowanie ze standardu (7,1,5,1 / 8 USD)
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 ++?
źródło
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:
Aby zadeklarować wartość wskaźnika - czyli rzeczywisty adres przechowywany we wskaźniku - jako stałą lub nietrwałą, użyj deklaracji postaci:
źródło