Frage

Schauen Sie sich dieses Zitat aus hier, in Richtung der Unterseite der Seite.(Ich glaube, die zitierte Bemerkung über consts gelten invariants)

Aufzählungen unterscheiden sich von consts, dass Sie nicht verbrauchen jeden Raum im Finale ausgegeben Objekt - /Bibliothek/Programm, in der Erwägung, dass consts tun.

Also anscheinend value1 wird aufblasen die ausführbare Datei, während value2 behandelt wird, als eine wörtliche und erscheint nicht in der Objekt-Datei.

const int value1 = 0xBAD;
enum int value2 = 42;

Zurück in C++ habe ich immer angenommen das war legacy Gründen, und der alte Compiler nicht optimieren entfernt Konstanten.Aber wenn dies ist immer noch wahr in D, es muss einen tieferen Grund hinter diesem.Wer weiß, warum?

War es hilfreich?

Lösung

Genau wie in C ++, eine Enumeration in D scheint eine "konservierte Ganzzahlliteral" ( Bearbeiten zu sein: erstaunlich, D2 sogar unterstützt Schwimmer und Strings ). Seine Enumeratoren haben keine Stelle. Sie sind nur unwesentlich als Wert ohne Identität.

Einlegen von enum ist neu in D2. Er definiert zunächst eine neue Variable. Es ist kein L-Wert (so auch seine Adresse nicht nehmen kann). Ein

enum int a = 10; // new in D2

Ist wie

enum : int { a = 10 }

Wenn ich mein armes D Wissen vertrauen können. So a hier ist kein L-Wert (kein Ort und man kann nicht seine Adresse übernehmen). Ein const jedoch hat eine Adresse. Wenn Sie eine globale (nicht sicher, ob dies die richtige D Terminologie) const-Variable, in der Regel der Compiler nicht optimieren kann weg, weil sie nicht wissen, welche Module diese Variable zugreifen kann oder könnte seine Adresse. So hat es Speicher für sie zu reservieren.

Ich denke, wenn Sie einen lokalen const haben, ist es weg die Compiler immer noch genauso wie in C ++ optimieren, da der Compiler durch einen Blick auf ihrem Umfang weiß, ob oder nicht, dass jemand in seiner Adresse interessiert ist, oder ob jeder nimmt nur seinen Wert.

Andere Tipps

Ihre eigentliche Frage; Warum enum / const ist das gleiche wie in D in C ++; scheint offen zu sein. Leider gibt es keinen guten Grund für diese überhaupt Wahl. Ich glaube, dass dies nur eine unbeabsichtigte Nebenwirkung in C ++, die ein De-facto-Muster wurde. In D wurde das gleiche Muster benötigt, und Walter Bright entschieden, dass es wie in C ++ so getan werden soll, dass die aus dieser kommenden Stelle würde erkennen, was in der Tat zu tun ..., bevor diese eher IMHO dummen Entscheidung, das Schlüsselwort manifest wurde verwendet, statt enum für dieses usecase.

Ich denke, ein guter Compiler / Linker sollte noch die Konstante entfernen. Es ist nur so, dass mit dem Enum, es ist tatsächlich in der Spezifikation gewährleistet. Der Unterschied ist in erster Linie eine Frage der Semantik. (Beachten Sie auch, dass 2.0 noch nicht abgeschlossen ist)

Der eigentliche Zweck der enum erweitert syntaktisch zur Unterstützung einzigen MANIFESTEN Konstanten, von dem, was ich verstehe, ist, dass Don Clugston, einer D Vorlage guru, war dabei einige verrückte Sachen mit Vorlagen.Er lief in lange build-Zeiten, lächerlich compiler memory usage, etc.da der compiler gehalten Schaffung interner Daten strucutres für const-Variablen.Eine wichtige Sache über const/immutable Variablen im Vergleich zu enums ist, dass const/immutable Variablen sind lvalues und können Ihre Adresse.Dies bedeutet, es wird einige zusätzlichen Aufwand für den compiler.Diese Regel keine Rolle spielt, aber wenn Sie ausführen, wirklich komplizierten compile-Zeit metaprograms, auch wenn const-Variablen optimiert sind Weg, das ist immer noch zu einem erheblichen Mehraufwand bei der Kompilierung.

Es klingt wie der ENUM-Wert „inline“ in Ausdrücken verwendet werden, wo als die konstanten Speicher tatsächlich nehmen und jeden Ausdruck referenziert wird den Wert aus dem Speicher wird geladen.

Dieses Geräusch ähnlich den Unterschied zwischen const vs. nur lesbar in C #. Ersteres ist eine Kompilierung-Konstante und die später ist eine Laufzeitkonstante. Dies ist definitiv betroffen Versionierung von Baugruppen (da Baugruppen mit einem Nur-Lese-Referenzierung bei der Kompilierung eine Kopie erhalten würde und nicht auf den Wert erhält eine Änderung, wenn die referenzierte Assembly mit einem anderen Wert wieder aufgebaut wurde).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top