Frage an caching, performance, c++, latency – Wird das Schlüsselwort register noch verwendet?

11

Ich bin gerade auf das Schlüsselwort register in C ++ gestoßen und habe mich gefragt, ob dies eine gute Idee ist (bestimmte Variablen in einem Register zu belassen). Tut dies der Compiler standardmäßig?

Also habe ich mich gefragt, ob dieses Schlüsselwort noch verwendet wird.

Aberinline ist nicht nur ein Hinweis. Fanael
stackoverflow.com/questions/1443982/… "Anmerkung: Inline ist nur ein Hinweis für den Compiler. Der Compiler muss es nicht inline setzen. - Loki Astari" user997112
"Wird es noch verwendet" ist etwas ganz anderes als "sollten Sie es noch verwenden". harold
bearbeitet, um oben zu reflektieren user997112

Deine Antwort

6   die antwort
13

register Schlüsselwort (es sei denn, es führt zu einem syntaktischen oder semantischen Fehler).

Die Norm schreibt auch nicht vor, dass irgendetwas in einem Register aufbewahrt werden muss; nur, dass es ein Hinweis auf die Implementierung ist, dass die Variable sehr oft verwendet wird. Seine Verwendung ist sogar veraltet.

7.1.1 Speicherklassenspezifizierer [dcl.stc]

3) Ein Registerspezifizierer ist ein Hinweis auf die Implementierung, dass die so deklarierte Variable häufig verwendet wird. [Anmerkung: Der Hinweis kann ignoriert werden und wird in den meisten Implementierungen ignoriert, wenn die Adresse der Variablen verwendet wird. Diese Verwendung ist veraltet (siehe D.2). - Endnote]

Haben Sie eine Quelle für diesen Anspruch? Das würde mich sehr wundern. Axel Gneiting
Aktuelle Versionen von clang warnen, wenn Sie in C ++ 11 überhaupt register verwenden. leecbaker
@AxelGneiting GCC macht (in C). user703016
Gibt es wirklich einen Compiler, der das respektiert?register? Axel Gneiting
7

Der Registerspezifizierer darf nur auf Namen von in einem Block (6.3) deklarierten Variablen oder auf Funktionsparameter (8.4) angewendet werden. Es gibt an, dass die benannte Variable eine automatische Speicherdauer hat (3.7.3). Eine Variable, die ohne Angabe einer Speicherklasse im Gültigkeitsbereich eines Blocks oder als Funktionsparameter deklariert wurde, hat standardmäßig eine automatische Speicherdauer.

Ein Registerspezifizierer ist ein Hinweis auf die Implementierung, dass die so deklarierte Variable häufig verwendet wird. [Anmerkung: Der Hinweis kann ignoriert werden und wird in den meisten Implementierungen ignoriert, wenn die Adresse der Variablen verwendet wird. Diese Verwendung ist veraltet (siehe D.2). - Endnote]

In Summe:register ist nutzlos, rastlos, atavistisch und veraltet. Sein Hauptzweck ist es, das Leben von Menschen zu erschweren, die versuchen, selbstregistrierende Klassen zu implementieren und die Hauptfunktion benennen möchtenregister(T *).

5

Wahrscheinlich die einzige ernsthafte Verwendung für dieregister Stichwort links ist aGCC-Erweiterung Damit können Sie ein hartcodiertes Hardwareregister ohne Inline-Assemblierung verwenden:

register int* foo asm("a5");

Dies bedeutet, dass jeder Zugriff auffoo wirkt sich auf das CPU-Register ausa5.

Diese Erweiterung hat natürlich nur geringen Nutzen außerhalb von Code auf sehr niedriger Ebene.

0

register" ist seit dem C ++ - Standard 2011 veraltet. sehen"Veraltete Verwendung des Registrierungsschlüsselworts entfernen". Es sollte daher nicht verwendet werden.

In meinen eigenen Experimenten habe ich festgestellt, dass sich der von gcc (v8.1.1) generierte Debug-Code unterscheidet, wenn das Schlüsselwort "register" verwendet wird. Der generierte Assembler-Code ordnet den Registern festgelegte Variablen zu. Benchmarks zeigten sogar, dass dieser Code schneller lief (als Code ohne "register"). Dies ist jedoch irrelevant, da der Release-Code (optimiert) keine Unterschiede aufwies (dh die Verwendung von "register" hatte keine Auswirkung). Vacbob StaatenHier Wenn eine Optimierung aktiviert ist, ignoriert gcc "register". Meine eigenen Tests bestätigen dies.

Verwenden Sie also zusammenfassend nicht "register", und wenn der Debug-Code bei Verwendung von "register" schneller zu laufen scheint, denken Sie daran, dass der optimierte Release-Code dies nicht tut.

3

es wird nicht verwendet. Es ist nur ein Hinweis und ein sehr schwacher. Compiler haben Registerzuordnungen, sie können herausfinden, welche Variablen in Registern gespeichert werden sollen (und berücksichtigen Dinge, über die Sie wahrscheinlich nie nachgedacht haben).

Eigentlich ist esist verwendet, schauen Sie sich nur an, warum Termux openjdk nicht mehr unterstützt: clang unterstützt es nicht mehr und OpenJDK mobile / jdk9 verwendet es. Kaeptm Blaubaer
5

verfügbar.

Außerdem ist dies nur ein Vorschlag für den Compiler. Die meisten Compiler können diese Optimierung selbst vornehmen, sodass die Verwendung nicht wirklich sinnvoll istregister Stichwort und so weiter, weil Compiler dem Vorschlag folgen können oder nicht.

Also das Einzigeregister Das Schlüsselwort, das mit modernen Compilern verwendet wird, verhindert, dass Sie es verwenden& die Adresse der Variablen zu nehmen.

Verwendung derregister Das Schlüsselwort verhindert lediglich, dass Sie die Adresse der Variablen in C übernehmen, während in C ++ der Compiler die Adresse der Variablen einfach ignoriertregister Stichwort.

Fazit ist,Benutze es einfach nicht!

Schön erklärt von Herb:
Keywords, die nicht (oder Kommentare von einem anderen Namen) sind

"-1":int x; kompiliert,intregisterx; nicht. Kerrek SB
@Cicada: Ja, und diese Frage bezieht sich auf C ++. Fanael
@Cicada: Hmm..ich verstehe..ich habe gerade Herb zitiert, scheint er hier ausgerutscht zu sein. Alok Save
@Fanael: Ich bin nicht sicher. Das letzte Mal, als ich register verwendet habe, war es fast nie so. Alok Save

Verwandte Fragen