Was ist der Hauptunterschied zwischen flüchtigen und konstanten Deklarationen in der Programmierung?


Antwort 1:

Alle Modifikatorschlüsselwörter für Variablen und Klasseneigenschaften werden zur Laufzeit gelöscht. Sie sind nur dazu da, dem Compiler einen Hinweis zu geben, wie die Variablen im Programm verwendet werden sollen. Einige der Dinge, die Sie einschränken können, sind:

  • Sichtbarkeit (öffentlich, privat usw.), die dem Compiler mitteilt, wo auf diese Variable zugegriffen werden darf, Vererbungsbeziehung (virtuell, überschreiben, endgültig usw.), die dem Compiler mitteilt, dass sich die Variable in einer virtuellen Zugriffstabelle befinden muss ( Der Zugriff auf diese Variable erfolgt in mehreren Schritten.) Zugriffsbeschränkung (const, volatile, extern, static, atomic usw.) teilt dem Compiler mit, wann er die Variable sicher de-referenzieren kann (und kann).

Um speziell über die beiden zu sprechen, die Sie erwähnt haben, const und volatile:

Beide zielen direkt auf den Optimierer im Compiler. Mit const gekennzeichnete Variablen sind schreibgeschützt. Der Optimierer kann die Adresse der Variablen durch den Inhalt der Variablen ersetzen, wodurch Daten dupliziert werden, der Code, der die Variable verwendet, jedoch möglicherweise beschleunigt wird. Der Compiler ist daran beteiligt, dass keine Zuordnung zu dieser variablen Position möglich ist. Dabei ist möglicherweise zur Laufzeit keine tatsächliche Referenz für diese Variable mehr vorhanden. Beachten Sie, dass diese Art der Optimierung beim Kompilieren für DEBUG oft nicht durchgeführt werden kann (da es für den Debugger schwieriger ist, den aktuellen Wert der Variablen zu finden und anzuzeigen).

Das Schlüsselwort volatile teilt dem Optimierer das Gegenteil von const mit und kann auch nicht davon ausgehen, dass der in einem Register gespeicherte Wert dieser Variablen aktuell ist. Der Code wird bei jeder Verwendung gezwungen, die Referenzierung der Variablen aufzuheben.

Bei der normalen Verarbeitung des Optimierers muss unter anderem abgebildet werden, welcher Wert in einem bestimmten Register (z. B. AX) zu einem bestimmten Zeitpunkt im Programm enthalten ist. Ein Optimierer ist eine Reihe von Mustern, die, wenn sie gefunden werden, zu Änderungen am endgültigen generierten Code führen (zu wahrscheinlich schnellerem Code). Wenn es beispielsweise eine Schleife findet, in der die Variable p in der Schleife verwendet wird, aber sicher ist, dass sie nicht durch die Schleife geändert wird, wird der Inhalt von p möglicherweise in ein Register geschrieben und in der gesamten Schleife dort belassen.

Das Schlüsselwort volatile teilt dem Optimierer mit, dass sich die markierte Variable jederzeit außerhalb des zu optimierenden Codes ändern kann. Aus diesem Grund kann die Optimierung im obigen Szenario nicht angewendet werden, da die Variable den Wert in AX ändern könnte und veraltet wäre. Dies hat den Nachteil, dass Variablen, die als flüchtig gekennzeichnet sind, langsamer zugänglich sind. Die häufigste Verwendung für flüchtige Daten ist eine variable Adresse, die zur Aktualisierung an eine externe Funktion übergeben wurde. Wenn Sie beispielsweise Speicherplatz für einen Treiber bereitstellen, der Sie über seinen Status informiert (serieller Eingang, Temperatursensoren usw.).