Abstrakte Erklärung
Sowohl C als auch C ++ haben das Konzept einer abstrakten Maschine . Wenn der Code den Wert einer Variablen verwendet, sagt die abstrakte Maschine, dass die Implementierung auf den Wert dieser Variablen zugreifen muss. Der Code des Formulars statement_A; statement_B; statement_C;
muss genau in der angegebenen Reihenfolge ausgeführt werden. Ausdrücke, die diesen drei Anweisungen gemeinsam sind, müssen bei jedem Auftreten neu berechnet werden.
Gemäß den abstrakten Maschinen statement_A; statement_B; statement_C;
muss die Implementierung angesichts der Reihenfolge der Anweisungen zuerst statement_A
in ihrer Gesamtheit, dann statement_B
und schließlich ausgeführt werden statement_C
. Die Implementierung kann sich nicht erinnern, dass Sie age
den Wert 5 zugewiesen haben. Jede Anweisung, auf die verwiesen wird, age
muss stattdessen auf den Wert dieser Variablen zugreifen.
Das volatile
Schlüsselwort wäre nicht erforderlich, wenn Implementierungen C- oder C ++ - Code gemäß den abstrakten Maschinenspezifikationen streng ausführen würden. Die abstrakten C- und C ++ - Maschinen haben kein Konzept von Registern, kein Konzept von allgemeinen Unterausdrücken, und die Ausführungsreihenfolge ist streng.
Beide Sprachen haben auch Als-ob- Regeln. Eine Implementierung entspricht dem Standard, solange sich diese Implementierung so verhält, als hätte sie Dinge gemäß der abstrakten Maschinenspezifikation ausgeführt. Der Compiler kann davon ausgehen, dass nichtflüchtige Variablen keine Werte zwischen Zuweisungen ändern. Solange die as-if
Regel nicht verletzt wird , kann die Sequenz statement_A; statement_B; statement_C;
implementiert werden, indem ein Teil von statement_C
, dann ein Teil von statement_A
, dann alles von statement_B
, dann der Rest von statement_A
und schließlich der Rest von ausgeführt wird statement_C
.
Diese Als-ob- Regeln gelten nicht für volatile
Variablen. In Bezug auf volatile
Variablen und Funktionen muss eine Implementierung genau das tun, was Sie ihr gesagt haben, und genau in der Reihenfolge, in der Sie ihr gesagt haben, dass sie Dinge tun soll.
Die abstrakte Maschinenspezifikation hat einen Nachteil: Sie ist langsam. Ein positiver Aspekt von C und C ++ im Vergleich zu anderen Sprachen ist, dass sie ziemlich schnell sind. Dies wäre nicht der Fall, wenn Code für diese abstrakten Maschinen ausgeführt würde. Die Als-ob- Regeln ermöglichen es C und C ++, so schnell zu sein.
ELI5 Antwort
Was bedeutet es, wenn der Compiler die Speicheradresse nicht "wegoptimiert"?
Das "Optimieren" einer Speicheradresse ist ein fortschrittliches Konzept, das nicht im Bereich der Fähigkeiten eines Fünfjährigen liegt. Konforme Fünfjährige tun genau das, was Sie ihnen sagen, nicht mehr und nicht weniger. Mit volatile
sagen Sie der Implementierung, dass sie sich wie fünf verhalten soll: Kein Denken, keine ausgefallenen Optimierungen. Stattdessen muss die Implementierung genau das tun, was der Code vorschreibt.
volatile
Variablen herauslesen und es 5