Was ist der Unterschied zwischen den Typ-Qualifiern const
und immutable
in D?Was ist der Unterschied zwischen const und unveränderlich in D?
Antwort
Etwas, das const
ist, kann nicht über diese Referenz mutiert werden, sondern könnte durch mutiert werden eine veränderbare Referenz auf die gleichen Daten. Etwas, das immutable
ist, kann nicht durch irgendein Verweis auf diese Daten mutiert werden. Also, wenn Sie haben
const C c = foo();
dann wissen Sie, dass Sie nicht die durch c
durch c
genannte Objekt mutieren kann, aber auch andere Verweise auf das Objekt, auf das c
kann im Code vorhanden ist, und wenn sie sind wandelbar , sie könnten es mutieren und daher ändern, was c
sieht. Aber wenn Sie
immutable C c = foo();
dann wissen Sie, dass es für das Objekt nicht möglich ist, auf die sich c
zu ändern. Sobald ein immutable
Objekt erstellt wurde, ist es illegal, dass es mutiert wird, und wenn Sie das Typsystem nicht durch Casting unterwandern, ist es nicht einmal möglich, einen veränderbaren Verweis auf ein immutable
Objekt zu haben. Und da immutable
Objekte in den Nur-Lese-Speicher geschrieben werden können, wenn der Compiler dies wählt, könnten Sie tatsächlich Segfolds und dergleichen erhalten, wenn Sie jemals versucht haben, immutable
wegzuwerfen und das Objekt mutieren zu lassen. Dasselbe gilt für const
, da sich eine const
Referenz tatsächlich auf ein immutable
Objekt beziehen könnte. Wegwerfen entweder const
oder immutable
und dann mutieren das dann veränderbare Objekt ist undefiniertes Verhalten und sollte grundsätzlich nie gemacht werden.
Und da ein Objekt immutable
niemals durch eine andere Referenz mutiert werden kann, ist das Lesen eines immutable
Objekts aus mehreren Threads vollständig Thread-sicher. So werden immutable
Objekte implizit über Threads gemeinsam genutzt, während alles andere, was nicht explizit mit shared
markiert ist, als thread-lokal betrachtet wird. immutable
bietet auch bessere Optimierungsmöglichkeiten für den Compiler als const
tut, weil es garantiert ist, nie zu ändern, während ein const
Objekt durch einen anderen Verweis auf die gleichen Daten ändern kann.
Für Werttypen gibt es keinen großen Unterschied zwischen const
und immutable
(da Sie keine veränderbaren Verweise auf nicht veränderbare Werttypen haben können), aber für Verweistypen gibt es einen signifikanten Unterschied.
Danke für eine sehr lehrreiche Antwort. Welche Entwickler verwenden D normalerweise für Werttypen? – user763305
@ user763305 Im Moment kann ich mir keinen technischen Grund vorstellen, einen der beiden anderen vorzuziehen, und ich weiß nicht, was der durchschnittliche D-Entwickler wählt. Persönlich wähle ich "unveränderlich", weil dann klar ist, dass es nicht mutiert werden kann ohne zu wissen, dass es ein Werttyp ist, aber das ist nur eine persönliche Präferenz. –
Aber "unveränderlich" weg von einem Charakter einer "Schnur" wegzuwerfen ist vollkommen in Ordnung? –
sie verschieden sind, dass immutable
Daten, könnte tatsächlich in schreibgeschützte Abschnitte Speicher platziert und daher alle Versuche, die Daten zu ändern, es wird scheitern.
Etwas erklärt const
(und nicht unveränderlich) auf der anderen Seite in der R/W-Abschnitt und dem Wert kann immer noch geändert werden über einen anderen nicht-const Verweis auf sie existiert.
So kann "Const-Ness" in einem solchen Fall umgangen werden, während Unveränderlichkeit nicht möglich ist.
über immutablity lesen. Das ist nicht ganz korrekt, da "const" -Daten eigentlich "unveränderlich" sein können. So können "const" -Daten auch in schreibgeschützten Abschnitten sein, da "unveränderliche" Daten implizit in "const" umgewandelt werden. – yaz
@ yaz Einverstanden. Ich sprach nicht über unveränderliche Besetzung in diesem Fall. –
Wenn Sie erklären, was als const
, versprechen Ihnen, dass Sie es nicht ändern wird. Wenn etwas als immutable
deklariert wird, erhalten Sie versprach, dass es nicht irgendwo anders modifiziert bekommen (und natürlich können Sie es auch nicht ändern)
Eine vom Typ const
deklarierte Variable kann einen veränderbaren Wert oder unveränderlichen Wert annehmen. Diese Definition ist relevant für referenzierte Typen wie Arrays und Objekte oder Zeiger. Es wird normalerweise für Funktionsargumente verwendet. Also in const ist eine Art von Wildcard-Attribut für veränderbare und unveränderliche Werte.
Es hat nicht viel Sinn für Werte, die mit einer Zuweisung wie einem char, int oder float kopiert werden.
Das Konzept von const und unveränderlich unterscheidet sich sehr von dem in C und C++ gefundenen. Ich war sehr verwirrt.
- 1. Was ist der Unterschied zwischen: D und: D :?
- 2. Unterschied zwischen unveränderlich und endgültig
- 3. Was ist der Unterschied zwischen Const und Constant?
- 4. Was ist der Unterschied zwischen printf ("% i") und printf ("% d")
- 5. Clojure: Was ist der Unterschied zwischen [D und [Ljava.lang.Double ;?
- 6. Was ist der Unterschied zwischen% d und% * d in der Sprache c?
- 7. Was ist der Unterschied zwischen unveränderlichen und konstanten Elementfunktionen?
- 8. Was ist der Unterschied zwischen unveränderlichen und const Variablen in Rust?
- 9. Was ist der Unterschied zwischen addImmutable und addColumn in Hbase?
- 10. Was ist der Unterschied zwischen `==` und `ist`?
- 11. Was ist der Unterschied zwischen Verilog! und ~?
- 12. Unterschied zwischen "\\ d +" und "\\ d ++" in Java Regex
- 13. Was ist der Unterschied zwischen logicalDpiX und physicalDpiX in Qt?
- 14. Was ist der Unterschied zwischen/* ... */und/** ... */
- 15. Was ist der Unterschied zwischen + = und = +?
- 16. Was ist der Unterschied zwischen $ (()) und Ausdruck?
- 17. Was ist der Unterschied zwischen:.! und: r !?
- 18. Was ist der Unterschied zwischen Difftime und '-'?
- 19. Was ist der Unterschied zwischen $ und $$?
- 20. was ist der Unterschied zwischen [[], []] und [[]] * 2
- 21. Was ist der Unterschied zwischen `&` und `ref`?
- 22. Was ist der Unterschied zwischen $ (...) und `...`
- 23. Was ist der Unterschied zwischen .Equals und ==
- 24. Was ist der Unterschied zwischen "$^N" und "$ +"?
- 25. Was ist der Unterschied zwischen? und ? = Nil
- 26. Was ist der Unterschied zwischen String und StringBuilder?
- 27. react-redux: Was ist der Unterschied zwischen state.setIn() und state.set()?
- 28. Was ist der Unterschied zwischen:
- 29. Was ist der Unterschied zwischen flach und ravel in numpy?
- 30. Wann und wie soll ich `const` und` unveränderlich` in D verwenden?
Sie können über http://ddili.org/ders/d.en/const_and_immutable.html – yaz