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_Ain ihrer Gesamtheit, dann statement_Bund schließlich ausgeführt werden statement_C. Die Implementierung kann sich nicht erinnern, dass Sie ageden Wert 5 zugewiesen haben. Jede Anweisung, auf die verwiesen wird, agemuss stattdessen auf den Wert dieser Variablen zugreifen.
Das volatileSchlü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-ifRegel 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_Aund schließlich der Rest von ausgeführt wird statement_C.
Diese Als-ob- Regeln gelten nicht für volatileVariablen. In Bezug auf volatileVariablen 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 volatilesagen 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.
volatileVariablen herauslesen und es 5