Wyjaśnienie abstrakcyjne
Zarówno C, jak i C ++ mają koncepcję abstrakcyjnej maszyny . Gdy kod używa wartości jakiejś zmiennej, maszyna abstrakcyjna mówi, że implementacja musi uzyskać dostęp do wartości tej zmiennej. Kod formularza statement_A; statement_B; statement_C;
należy wykonać w dokładnie określonej kolejności. Wyrażenia wspólne dla tych trzech instrukcji muszą być ponownie obliczane za każdym razem, gdy występują.
W maszynach abstrakcyjnych, biorąc pod uwagę sekwencję instrukcji statement_A; statement_B; statement_C;
, implementacja musi najpierw działać statement_A
w całości, a następnie w statement_B
końcu statement_C
. Implementacja nie pamięta, że przypisałeś age
wartość 5. Każda instrukcja, do której się odwołuje, age
musi zamiast tego uzyskać dostęp do wartości tej zmiennej.
Słowo kluczowe nie byłoby potrzebne, volatile
jeśli implementacje ściśle wykonałyby kod C lub C ++ zgodnie ze specyfikacjami abstrakcyjnej maszyny. Maszyny abstrakcyjne C i C ++ nie mają pojęcia rejestrów, nie są powszechnie stosowane podwyrażenia, a kolejność wykonywania jest ścisła.
Oba języki mają również takie same zasady. Implementacja jest zgodna ze standardem, pod warunkiem, że implementacja zachowuje się tak, jakby wykonała wszystko zgodnie ze specyfikacją abstrakcyjnej maszyny. Kompilator może zakładać, że zmienne nielotne nie zmieniają wartości między przypisaniami. Dopóki nie złamie as-if
reguły, sekwencja statement_A; statement_B; statement_C;
może zostać zaimplementowana przez wykonanie części statement_C
, następnie części statement_A
, następnie wszystkich statement_B
, a następnie reszty statement_A
, a na końcu reszty statement_C
.
Te zasady „ jak gdyby” nie mają zastosowania do volatile
zmiennych. W odniesieniu do volatile
zmiennych i funkcji, implementacja musi robić dokładnie to, co jej nakazałeś, i dokładnie w takiej kolejności, w jakiej kazałeś to robić.
Ta abstrakcyjna specyfikacja maszyny ma wadę: jest powolna. Pozytywnym aspektem C i C ++ w porównaniu do innych języków jest to, że są one dość szybkie. Nie byłoby tak, gdyby kod został wykonany dla tych abstrakcyjnych maszyn. Na jak-jeśli zasady są co umożliwi C i C ++ się tak szybko.
Odpowiedź ELI5
co to znaczy, że kompilator nie „optymalizuje” adresu pamięci?
„Optymalizacja” adresu pamięci to zaawansowana koncepcja, coś, co nie mieści się w zakresie możliwości pięciolatka. Pięciolatki zgodne z przepisami zrobią dokładnie to, co im każesz, nie więcej, nie mniej. Dzięki volatile
, mówisz realizację zachowywać się jak to jest pięć: Nie myślenia, nie ma optymalizacje fantazyjne. Zamiast tego implementacja musi robić dokładnie to, co nakazuje kod.
volatile
zmiennej, która mówi 5, i czytasz ją ponownie w przyszłym roku, masz gwarancję, że dostaniesz 6.