2012-01-24 17 views
11

widzę praktycznego zastosowania dla zmiennej wykwalifikowanego const volatile, jakCzy istnieje praktyczne zastosowanie wskaźnika "volatile restrict"?

const volatile uint64_t seconds_since_1970; 

jeśli bazowy mechanizm sprzętowy aktualizuje wartości co drugi, ale zmienna nie ma prawa zapisu w (prawdopodobnie) wbudowanego sprzętu. A ponieważ wszystkie trzy (cztery w C11) kwalifikatory typu są uważane za niezależne, wszystkie kombinacje wydają się być dozwolone. Ale jestem ze stratą wyobrażając sobie sytuację prawdziwego życia, gdzie restrict volatile wykwalifikowany wskaźnik naprawdę sensu:

uint32_t * restrict volatile pointer_to_some_uint32; 

[EDIT: Do wyjaśnienia: Zarówno volatile i restrict stosuje się do wskaźnika, a nie przedmiotem wskazał to!]

Czy jest to konstrukcja dozwolona przez język, ale bezużyteczna sama w sobie, czy też brakuje mi obszaru zastosowania, w którym może to być cenne?

+0

Cztery? 'const'' volatile' 'restrict' ...... Czy możesz powiedzieć mi, co jest czwartym kwalifikatorem? Przepraszamy za moją małą wiedzę> o < – ikh

+0

@ikh C11 definiuje kwalifikator "_Atomic". –

Odpowiedz

8

Bez ograniczeń wskaźnik nieulotny może alias zmiennego wskaźnika. Tak więc, po każdej modyfikacji obiektu poprzez wskaźnik zmienności, buforowane wartości wszystkich obiektów, które są potencjalnie wskaźnikowane tego samego typu, muszą zostać odrzucone.

Z ograniczeniami, można powiedzieć kompilatorowi, że zmienny wskaźnik nie będzie alias, tak aby obciążenie lotne dotyczyło tylko wskazanego obiektu, a nie wszystkich innych obiektów tego samego typu, które mogłyby być dostępne za pomocą wskaźników.

+0

W moim przykładzie "lotny" odnosi się do wskaźnika, a nie do obiektu, na który wskazuje. Wiem, że używanie 'volatile uint32_t * restring point;' może być bardzo użyteczne, ale deklarowanie samego wskaźnika zarówno 'volatile', jak i' restrict' nie przesuwa 'volatile' na wskazany obiekt, prawda? –

+1

@Johan: Pomyśl, że być może mechanizm sprzętowy aktualizuje 'pointer_to_some_uint32' od czasu do czasu (co jest daleko naciągane, ale implementacja może to zrobić), a ponadto adres, na który pisze, gwarantuje, że nie będzie inny wskaźnik. Wtedy jest to "lotne ograniczenie". Zwykle 'restr' jest dobre dla argumentów funkcji, a' volatile' nie ma sensu dla zmiennych lokalnych, więc wybrałeś przykład, który jest mało prawdopodobny do użycia, nawet jeśli nie jest całkowicie bezużyteczny. –

+0

@SteveJessop Tak, to również moja interpretacja. Jedyne, co wymyśliłem, to sortownik śmieci zmieniający kolejność pamięci i działający w innym wątku/procesie. Takie wskaźniki mogłyby być ważne zarówno jako "zmienne" (ponieważ GC może zmienić wskaźniki) i "ograniczyć", gdyby żadne inne wskaźniki nie wskazywały na sekcje GC-admin części pamięci utrzymywanych przez GC. Ale odpowiedź z @R .. wydaje się wskazywać na obiekt wskazany jako "dziedziczy" 'volatile' (" narzut lotności dotyczy tylko wskazanego obiektu "), co jest nieprawidłowym IMHO. –