2016-05-26 11 views
5

Prowadzę badania i nie znalazłem dobrej odpowiedzi i mam nadzieję na lepsze zrozumienie. Wiem, jak używać volatile, ale mam pytanie dotyczące tego, co robi, gdy jego położenie jest inne w deklaracjach zmiennych, na przykład.C++ Pozycja kwantyfikatora typu lotnego w zmiennej definicji

  • volatile int * ptr;

Liczba całkowita wskazał na to volatile i podczas odczytu/zapisu do tego miejsca pamięci zawsze iść do miejsca pamięci.

  • int * volatile ptr;

Wartość wskaźnika jest sam volatile i podczas odczytu/zapisu do tego miejsca pamięci zawsze iść do miejsca pamięci.

To subtelna różnica, ale z tego, co widzę, różnica jest taka.

volatile int * foo; 
int * volatile bar; 
volatile int testInt = 5; 
------------------------ 
|   0x020   | - 0x000 (foo), memory location 0x000 can be cached. 
------------------------ 
|   0x020   | - 0x010 (bar), memory location 0x010 can't be cached. 
------------------------ 
|   5   | - 0x020 (testInt) 
------------------------ 

Moje pytanie brzmi: jeśli na przykład lotny kwantyfikator nie znajduje się w typie wskaźnika.

volatile int foo = 5; 
int volatile bar = 5; 
------------------------ 
|   5   | - 0x000 (foo), memory location 0x000 can't be cached. 
------------------------ 
|   5   | - 0x004 (bar), memory location 0x004 can't be cached. 
------------------------ 

Nie te dwie deklaracje zrobić to samo dla deklaracji non-wskaźnik?

+2

Tak robią to samo. –

+1

Czy Twoje pytanie brzmi - czy "zmienna int" jest tego samego typu co "int volatile"? – Barry

Odpowiedz

2

Tak, kolejność słów kluczowych modyfikatorów jest elastyczna. Robi to samo po lewej lub po prawej stronie typu. To samo dotyczy const.

Wolę modyfikator po typu, ponieważ pozwala czytać od prawej do lewej, aby uzyskać zwykły angielski definicji.

int volatile * foo; // "foo is a pointer to a volatile int" 
int * volatile foo; // "foo is a volatile pointer to an int" 
int const * foo; // "foo is a pointer to a constant int" 
int * const foo; // "foo is a constant pointer to an int" 

Więc własnym ujednolicić

int volatile foo;