Hi Leute! Ich mache gerade meinen ersten Versuche mit VB und habe eine Frage: Im Internet habe ich gelesen, dass es für Arrays den Befehl ReDim gibt, um die Größe des Arrays während der Laufzeit zu vergößern. Um den Inhalt zu erhalten gibt es zusätzlich Preserve. Dann gibt es noch die Variable deklariert als String. Hier finde ich nirgends etwas über die Notwendigkeit, die Größe der Variable (ist ja auch ein Array von Zeichen) zu erhöhen. Hier kann ich beliebig lange Zeichenketten zuweisen. Frage: Wo ist der Unterschied und wie ist es im Speicher organisiert? Bei beliebiger Vergrößerung müsste ja quasi jedes Zeichen einen Zeiger auf das nächste besitzen. Weiß jemand Bescheid? Ich finde im Netz keine zufriedenstellende Antwort. Danke!
Gleich vorweg: Ich habe mit VB nichts am Hut. > Frage: Wo ist der Unterschied und wie ist es im Speicher organisiert? Ein Array ist in diesem Fall ein einfacher Speicherblock, in dem nacheinander (indizierbar) Werte stehen. ReDim allokiert einen neuen Block und kopiert bei Bedarf Daten aus dem alten (Preserve). Das Ganze dient im Prinzip nur der Rückwärtskompabilität; in VB.NET sollte man eher die generischen Collections verwenden, z.B. List(Of T). Auch bei einem String wird - wenn der zur Verfügung stehende Speicherbereich komplett mit Zeichen belegt ist - ein neuer Block allokiert, Daten werden kopiert und der alte Block wird verworfen. Nur geschieht dies intern in der String-Klasse, so dass man sich darum nicht kümmern muss (ähnlich wie bei 'List'). Es gibt natürlich eine Reserve - mehr oder weniger "intelligent" bestimmt; meist wird die Größe des Speicherbereichs verdoppelt -, damit nicht bei jedem Hinzufügen eines Zeichens Speicher allokiert werden muss. > Bei beliebiger Vergrößerung müsste ja quasi jedes Zeichen einen Zeiger > auf das nächste besitzen. Nicht bei String oder List, aber es gibt die Klasse LinkedList (LinkedList(Of T)), bei dies so funktioniert. Der Einsatz ist aber nur in speziellen Fällen sinnvoll. Einerseits, weil einige Operationen deutlich weniger effizient sind, da man sich ja "durchhangeln" muss, andererseits weil die Daten im Speicher verstreut liegen und der CPU-Cache das nicht mag (wobei das natürlich bei Referenztypen auch bei anderen Datenstrukturen der Fall ist). https://msdn.microsoft.com/de-de/library/wak0wfyt.aspx https://msdn.microsoft.com/de-de/library/w8k3cys2.aspx https://msdn.microsoft.com/de-de/library/he2s3bh7 http://csharpindepth.com/Articles/General/Strings.aspx
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.