Forum: PC-Programmierung VB2015 - Array und String - dynamische Länge


von Georg (Gast)


Lesenswert?

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!

von Klaus-Kurt Knatter (Gast)


Lesenswert?

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

von Georg (Gast)


Lesenswert?

Vielen Dank Klaus!

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
Noch kein Account? Hier anmelden.