Wie würde sich ein "register volatile int i" in C verhalten?

8

Ich verstehe, dass ein Register-Schlüsselwort ein Register für die Berechnung des Wertes und ein flüchtiges Schlüsselwort den Wert aus dem Speicher jedes Mal liest, wenn wir etwas an der Variablen berechnen und den Code grundsätzlich nicht optimieren. Wenn also eine Variable diesen beiden Schlüsselwörtern zugeordnet wird, würde das bedeuten, dass sie im Wesentlichen selbst flüchtig wäre? Ich kann das Verhalten nicht verstehen, indem ich einen Beispielcode schreibe. Kann jemand etwas Licht abwerfen?

    
knightofhorizon 24.09.2012, 15:15
quelle

2 Antworten

13

In C verhält sich die register -Speicherklasse genau wie die auto -Speicherklasse, außer dass die Implementierung (nach 5.1.1.3) erforderlich ist, um eine Diagnose auszugeben, wenn das Programm versucht, die Adresse des Objekt (6.5.3.2, 6.7.1). Die Verwendung von register als Optimierungshinweis für den Compiler ist im Allgemeinen sinnlos, da ein Compiler, der schlau genug ist, um die nicht gespeicherte Qualität des Objekts auszunutzen, sicherlich intelligent genug ist, um zu verfolgen, welche Objekte deklariert werden könnten register ; Stattdessen sollte es als eine Codequalitätsüberprüfung verstanden werden, dass der Programmierer nicht versehentlich Optimierungsmöglichkeiten zerstört, indem er die Adresse des Objekts nimmt.

Mit anderen Worten hat das Entfernen aller Instanzen des Schlüsselworts register aus einem gültigen Programm keine Auswirkung auf die Semantik des Programms; Ähnlich ist es in static_assert .

Das Qualifikationsmerkmal volatile gibt an, dass Zugriffe auf (Lese- und Schreibvorgänge) Objekte als Nebeneffekte betrachtet werden und nicht entfernt werden können. Für ein Objekt, das nicht in einem Speicher mit definiertem Speicherplatz vorhanden ist (d. H. Mit einem Speicher mit der Speicherklasse register ), wäre dies am nützlichsten beim Leistungstest:

%Vor%     
ecatmur 24.09.2012, 15:39
quelle
5

volatile bedeutet, dass sich das Objekt auf eine Weise ändern kann, die für den Compiler nicht vorhersehbar ist, und register bedeutet, dass seine Adresse nicht übernommen werden kann.

Die Kombination von beiden macht durchaus Sinn, wenn das Objekt tatsächlich ein Hardware-Register auf der Plattform ist. Einige Compiler (z. B. gcc) haben sogar Erweiterungen, um eine solche Variable an ein bestimmtes Hardware-Register zu binden.

Ein anderer Code könnte ein solches Hardware-Register ändern, und der Compiler kann daher nichts vom aktuellen Wert annehmen. In einem solchen Fall wäre es sogar sinnvoll, einen const Qualifier hinzuzufügen. ZB mit gcc's extension

%Vor%

Sie hätten jederzeit ein Werkzeug, um das Register eax zu überprüfen, aber Sie könnten es nicht versehentlich ändern.

    
Jens Gustedt 24.09.2012 16:47
quelle

Tags und Links