Unlike Long Strings, that get "split" when we change one of them (to get a unique copy), dynamic arrays keep pointed to the same area. A bit unexpected, perhaps, but at least we don't get delayed performance hits (like with Long Strings)... Of course, since dynamic array contents are copied when we call SetLength, that's also all it takes (a call to SetLength) to create a unique copy of a dynamic array.
mschnell hat geschrieben:Ich hatte gedacht, es würde "copy on write" gemacht, wie bei Strings.
Ich kann dein Erstaunen nachvollziehen, zumal man doch irgendwie im Kopf hat, dass die Dinger wie Long Strings funktionieren. Aber die Compiler Fritzen werden sich schon was dabei gedacht haben, hoff ich mal
Nur ist ein dynamisches Array fast das gleiche wie ein langer String.
Wenn du aber AnsiStr1:=AnsiStr2 machst, dann kriegst du eine Kopie.
Das erstaunliche ist nun, dass DynArr1:=DynArr2 keine Kopie macht sondern auf den gleichen Speicherbereich zeigt.
Erst Copy or SetLength reserviert einen eigenen Speicherbereich für die Variable.
das ist das gleiche.
du kannst einen Array nicht so zuweisen:
DynArr1:=DynArr2
das ist immer ein Pointer, soviel wie ich weiß.
DynArr1 hat jetzt den gleichen wert wie DynArr2. wenn du jetzt DynArr1 änders du eigentlich nur DynArr2 und nicht DynArr1.
Das habe ich mal irgendwo gelesen, das das so sein soll.
du kannst nur einen String zuweisen:
str:=str;
oder einen integer aber halt keinen Array. egal ob statisch oder dynamisch
Der pluto macht sich.
Intern wird ein dyn. Array wie in c direkt mit dem Speicherbereich angesprochen. Und dieses Verhalten wurde hier nach außen nicht "korrigiert".
Ist aber nach dem vorbild von Borland so entstanden. Es wäre sicherlich nicht das riesen Problem das der Compiler dort ein Copy macht. Aber hat Borland nun damals so angefangen und so wirds weiter gemacht.
pluto hat geschrieben:richtig Klasse1.name würde hier geändert werden, weil es nur ein normaler Zeiger/Pointer ist
und genau das gleiche ist dir passiert mschnell du hast einfach nur ein Pointer "erzeugt" der auf b zeigt.
oder Sehe ich das jetzt Falsch ?
Richtig,
Aber bei Strings ist das anders. Die machen "copy on write" obwohl sie eigentlich auch Zeiger (mit Zusatzinformationen) sind, genau wir dynamic arrays. Ist eben 'ne andere Art so etwas zu implementieren. Aber schon merkwürdig dass in Delphi / FP das eine so und das andere anders implementiert ist. Da muss man schon aufpassen.