2013-04-28 14 views
23

Zastanawiam o różnych zastosowaniach lotnej słów kluczowych w połączeniu z rejestru, const i statyczne kluczowych. Nie jestem pewien, jakie są efekty, więc myślę:const lotny, zarejestruj lotny, statyczne lotny w C++

register volatile int T=10; 

Zaproponuj kompilator do przechowywania T w rejestrze oraz wartość T może być modyfikowany gdzieś na zewnątrz (OS, hardware, innym wątku)

const volatile int T=10; 

Sam program nie może modyfikować T, ale T może zostać zmodyfikowany gdzieś poza kodem.

static volatile int T=10; 

Jeśli T jest członkiem dane klasy, oznacza to, że wszystkie obiekty klasy mają taką samą wartość dla T i T może być modyfikowany gdzieś na zewnątrz. Jeśli T jest zmienną globalną w pliku, kod źródłowy w innych plikach (które są częścią projektu) nie może uzyskać dostępu do T, ale T może być dostępny z zewnątrz. Jeśli T jest zmienną lokalną w funkcji, po jej zainicjowaniu pozostaje ona w pamięci do końca programu i może zostać zmieniona gdzieś na zewnątrz.

Czy moje myśli są poprawne i czy każdy doświadczony programista w C++ może podać przykład, w którym powyższe może być używane w rzeczywistych aplikacjach lub jest bardzo rzadkie?

+0

Bardzo ładne! +1. Może nawet zawierać "zmienne". –

Odpowiedz

26
register volatile int T=10; 

volatile kwalifikator oznacza, że ​​kompilator nie może stosować optymalizacje lub zmienić kolejność dostępu do T, ile register to aluzja do kompilatora że T będzie mocno używane. Jeśli zostanie podany adres T, wskazówka jest po prostu ignorowana przez kompilator. Zauważ, że register jest przestarzałe, ale nadal używane.

Praktyczne Zastosowanie:

Nigdy nie używałem nigdy nie czułem potrzeby, dla niego i nie mogę myśleć o dowolnej chwili.


const volatile int T=10; 

const kwalifikator T oznacza, że ​​nie mogą być modyfikowane przez kod. Jeśli spróbujesz to zrobić, kompilator dostarczy diagnostykę. volatile nadal oznacza to samo co w przypadku 1. Kompilator nie może zoptymalizować ani zmienić kolejności dostępu do T.

Praktyczne Zastosowanie:

  • Dostęp do pamięci współdzielonej w trybie tylko do odczytu.
  • Dostęp do rejestrów sprzętowych w trybie tylko do odczytu.

static volatile int T=10; 

static przechowywania kwalifikator daje T statycznego Czas składowania (C++, 11), a internal linkage §3.7, przy volatile jeszcze reguluje optymalizacji i zmiany kolejności.

Praktyczne Zastosowanie:

  • samo jak volatile wyjątkiem, że trzeba mieć obiekt statyczny czas przechowywania i być niedostępne z innych jednostek tłumaczeniowych.
+2

Po drugie, czy jesteś pewny, że mówisz o stałych ulotnych * obiektach * lub stałych ulotnych * odniesieniach * (lub wskaźnikach do obiektów niestabilnych)? Ponieważ nie wygląda na to, aby stały obiekt mógł zostać zmapowany na sprzęt ... – Mehrdad

+1

@Mehrdad: Miałem na myśli wskaźnik do obiektów niestabilnych, takich jak: 'unsigned char const volatile * hd_addr;' –

+1

Tak, twoje przykład pokazuje 'const volatile int T = 10;', który jest inny. :) – Mehrdad