2013-06-14 15 views

Antwort

15

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.

+1

Danke für eine sehr lehrreiche Antwort. Welche Entwickler verwenden D normalerweise für Werttypen? – user763305

+1

@ 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. –

+0

Aber "unveränderlich" weg von einem Charakter einer "Schnur" wegzuwerfen ist vollkommen in Ordnung? –

1

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.

(Reference)

+0

ü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

+0

@ yaz Einverstanden. Ich sprach nicht über unveränderliche Besetzung in diesem Fall. –

13

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)

0

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.

Verwandte Themen